home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / 2m30src.zip / 2MDOS.ASM < prev    next >
Assembly Source File  |  1995-03-06  |  93KB  |  2,115 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│                   █████ █   █ ███   █████  █████                  │
  5. ;│                       █ ██ ██ █  █  █   █  █                      │
  6. ;│                   █████ █ █ █ █   █ █   █  █████                  │
  7. ;│                   █     █   █ █  █  █   █      █                  │
  8. ;│                   █████ █   █ ███   █████  █████                  │
  9. ;│                                                                   │
  10. ;│                                                                   │
  11. ;│        2MDOS 1.0  -  (C) 1994-1995  Ciriaco García de Celis.      │
  12. ;│                                                                   │
  13. ;│      Para obtener el ejecutable:                                  │
  14. ;│        TASM  2mdos    /m5                                         │
  15. ;│        TLINK 2mdos    /t                                          │
  16. ;│                                                                   │
  17. ;│   El fichero 2MFBOOT.DB que se carga con INCLUDE debe obtenerse   │
  18. ;│   previamente a partir de 2MFBOOT.ASM con ayuda de 2MFBMAKE.BAS   │
  19. ;│                                                                   │
  20. ;└───────────────────────────────────────────────────────────────────┘
  21.  
  22. ON             EQU   1                 ; constantes booleanas
  23. OFF            EQU   0
  24.  
  25. ; ------------ Macros de propósito general.
  26.  
  27. XPUSH          MACRO regmem            ; apilar lista de registros
  28.                  IRP rm, <regmem>
  29.                    PUSH rm
  30.                  ENDM
  31.                ENDM
  32.  
  33. XPOP           MACRO regmem            ; desapilar lista de registros
  34.                  IRP rm, <regmem>
  35.                    POP rm
  36.                  ENDM
  37.                ENDM
  38.  
  39. ; ------------ Programa.
  40.  
  41. _PRINCIPAL     SEGMENT
  42.                ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
  43.  
  44.                ORG   100h
  45.  
  46. ini_residente  EQU   $
  47.  
  48. ; ****************************************
  49. ; *                                      *
  50. ; *   D A T O S    R E S I D E N T E S   *
  51. ; *                                      *
  52. ; ****************************************
  53.  
  54. inicio:        JMP   main
  55.  
  56. ; ------------ Identificación estandarizada del programa.
  57.  
  58. program_id     LABEL BYTE
  59. segmento_real  DW    0   ; segmento real donde será cargado
  60. offset_real    DW    0   ; offset real     "     "     "
  61. longitud_total DW    0   ; zona de memoria ocupada (párrafos)
  62. info_extra     DB    80h ; bits 0, 1 y 2-> 000: normal, con PSP
  63.                          ;                 001: bloque UMB XMS
  64.                          ;                 010: *.SYS
  65.                          ;                 011: *.SYS formato EXE
  66.                          ; bit 7 a 1: «extension_id» definida
  67. multiplex_id   DB    0   ; número Multiplex de este TSR
  68. vectores_id    DW    tabla_vectores
  69. extension_id   DW    tabla_extra
  70.                DB    "*##*"
  71. autor_nom_ver  DB    "CiriSOFT:2MDOS:1.0",0
  72.                DB    2  ; número de vectores de interrupción usados
  73. tabla_vectores EQU   $
  74. i13_40_0       DB    13h           ; INT 13h
  75. ant_i13        LABEL DWORD         ; dirección original
  76. ant_i13_off    DW    0
  77. ant_i13_seg    DW    0
  78.                DB    2Fh           ; INT 2Fh
  79. ant_i2F        LABEL DWORD         ; dirección original
  80. ant_i2F_off    DW    0
  81. ant_i2F_seg    DW    0
  82.  
  83. tabla_extra    LABEL BYTE
  84.                DW    ctrl_exterior ; permitido control exterior
  85.                DW    0             ; campo reservado
  86.  
  87. ctrl_exterior  LABEL BYTE
  88. reubicabilidad DB    1             ; programa 100% reubicable
  89. activacion     DW    act
  90. act            DB    1
  91.  
  92. ; ******************************************************
  93. ; *                                                    *
  94. ; *   C O D I G O   Y   D A T O S   D E    2 M D O S   *
  95. ; *                                                    *
  96. ; ******************************************************
  97.  
  98. sop2m          DB    ?       ; indica si hay soporte 2M instalado
  99. sopdcopy       DB    ON      ; por defecto, soporte para DISKCOPY
  100. opt            DB    ON      ; por defecto, optimización de formateo
  101. boost          DB    ON      ; por defecto, optimización DiskBoost
  102. fdread         DB    ON      ; por defecto, con soporte FDREAD
  103. fmt            DB    OFF     ; por defecto, sin apoyo a MS-DOS FORMAT
  104. x_hd           DW    2       ; sector sliding para alta densidad
  105. y_hd           DW    3
  106. x_dd           DW    1
  107. y_dd           DW    3       ; sector sliding para doble densidad
  108. mingap         DW    32      ; GAP3 mínimo para interleave 1:1
  109. fmt_A          DW    0       ; formato activo en curso (0 DOS/FDF)
  110.                DW    0       ; cilindros/sectores del formato
  111. fmt_B          DW    0       ; ídem para B:
  112.                DW    0
  113.  
  114. xms_handler    LABEL DWORD   ; dirección del controlador XMS, si
  115. xms_hndl_off   DW    ?       ; está instalado
  116. xms_hndl_seg   DW    ?
  117. xms_handle     DW    0       ; handle XMS (0 = no utilizada XMS)
  118.  
  119. ; ------------ Rutina de gestión de INT 2Fh.
  120.  
  121. nueva_i2F      PROC  FAR
  122.                STI
  123.                CMP   AH,CS:multiplex_id
  124.                JE    preguntan
  125.                JMP   CS:ant_i2F        ; saltar al gestor de INT 2Fh
  126. preguntan:     CMP   DI,1992h
  127.                JNE   ret_no_info       ; no llama alguien del convenio
  128.                MOV   AX,ES
  129.                CMP   AX,1492h
  130.                JNE   ret_no_info       ; no llama alguien del convenio
  131.                PUSH  CS
  132.                POP   ES                ; sí llama: darle información
  133.                LEA   DI,autor_nom_ver
  134. ret_no_info:   MOV   AX,0FFFFh         ; "entrada multiplex en uso"
  135.                IRET
  136. nueva_i2F      ENDP
  137.  
  138. ; ------------ Nueva rutina de gestión de INT 13h.
  139.  
  140. nueva_i13      PROC
  141.                STI
  142.                CMP   DL,1
  143.                JA    jmp_bios          ; no es disquetera
  144.                CMP   AH,2
  145.                JB    jmp_bios
  146.                CMP   AH,5
  147.                JB    fdread_code
  148.                JNE   otra_func
  149.                JMP   format
  150. otra_func:     CMP   AH,18h
  151.                JNE   set_old?
  152.                JMP   set_media
  153. set_old?:      CMP   AH,17h
  154.                JE    set_old_media
  155. jmp_bios:      JMP   CS:ant_i13
  156.  
  157. ; ------------ Emulación de FDREAD.
  158.  
  159. fdread_code:   CMP   CS:fdread,ON      ; funciones 2, 3 y 4
  160.                JNE   jmp_bios
  161.                XPUSH <AX, BX, DS>
  162.                XOR   BX,BX
  163.                MOV   DS,BX
  164.                LDS   BX,DS:[1Eh*4]     ; DS:BX -> tabla base disco
  165.                ADD   AL,CL
  166.                DEC   AL
  167.                MOV   [BX+4],AL             ; sectores/pista necesarios
  168.                MOV   BYTE PTR DS:[BX+5],1  ; GAP R/W mínimo
  169.                OR    CH,CH                 ; ¿pista 0?
  170.                XPOP  <DS, BX, AX>
  171.                JZ    call_i13          ; así es
  172.                PUSH  AX                ; *
  173.                PUSHF
  174.                CALL  CS:ant_i13
  175.                JNC   exit_ok           ; no hubo error
  176.                CMP   AH,3
  177.                JE    exit_nok          ; protegido de escritura
  178.                CMP   AH,6
  179.                JE    exit_nok          ; cambio de disco
  180.                CMP   AH,9
  181.                JE    exit_nok          ; frontera de DMA (INT 40h)
  182.                POP   AX
  183.                XPUSH <DS, BX>          ; lo hubo...¿será del stepping?
  184.                MOV   BX,40h
  185.                MOV   DS,BX
  186.                MOV   BX,90h
  187.                ADD   BL,DL
  188.                CMP   CH,43             ; ¿pista > 43?
  189.                JA    quita_step
  190.                XOR   BYTE PTR DS:[BX],20h    ; invertir doble stepping
  191.                JMP   fin_step
  192. quita_step:    AND   BYTE PTR DS:[BX],0DFh   ; quitar doble stepping
  193. fin_step:      XPOP  <BX, DS>
  194. call_i13:      PUSHF
  195.                CALL  CS:ant_i13
  196.                PUSH  AX
  197.                JMP   exit_ok
  198. exit_nok:      STC
  199. exit_ok:       INC   SP
  200.                INC   SP                ; quitar AX de la pila
  201.                RETF  2
  202.  
  203. ; ------------ Nueva función 17h.
  204.  
  205. set_old_media: PUSH  BX
  206.                CALL  ptr_BX_data
  207.                MOV   WORD PTR CS:[BX],0  ; formatos flexibles sólo en
  208.                POP   BX                  ; la función 18h, no la 17h
  209.                JMP   CS:ant_i13
  210.  
  211. ; ------------ Nueva función 18h.
  212.  
  213. set_media:     XPUSH <DS, BX>          ; *1-2-3
  214.                PUSH  CS
  215.                POP   DS
  216.                MOV   disco,DL
  217.                MOV   cilsec,CX
  218.                CALL  get_fmt           ; buscar el formato solicitado
  219.                JNC   hay_fmt           ; existe
  220. f18_bios:      MOV   CX,cilsec
  221.                MOV   DL,disco
  222.                XPOP  <BX, DS>          ; *1
  223.                JMP   jmp_bios          ; formato no reconocido (¿?)
  224. hay_fmt:       CMP   BYTE PTR [BX+1],0 ; formatos del DOS
  225.                JE    fmt_dos_fdf
  226.                CMP   sopdcopy,ON
  227.                JNE   f18_bios          ; no hay soporte DISKCOPY
  228.                CMP   BYTE PTR [BX+1],2 ; formatos 2M
  229.                JE    fmt_2m
  230.                CMP   fdread,ON         ; formatos FDFORMAT...
  231.                JE    fmt_dos_fdf
  232.                JMP   f18_bios          ; no se emula soporte FDFORMAT
  233.  
  234. fmt_2m:        MOV   BX,[BX+2]
  235.                PUSH  BX
  236.                CALL  ptr_BX_data
  237.                MOV   DI,BX
  238.                POP   BX
  239.                MOV   [DI],BX           ; formato 2M seleccionado
  240.                MOV   BX,cilsec
  241.                MOV   [DI+2],BX
  242.                MOV   f2m_nsects,BL
  243.                MOV   f2m_npistas,BH
  244.                XPOP  <BX, DS>          ; *2
  245.                PUSH  CS
  246.                POP   ES
  247.                LEA   DI,param_f2m      ; tabla INT 1Eh para formato 2M
  248.                MOV   AH,0
  249.                CLC
  250.                RETF  2
  251.  
  252. fmt_dos_fdf:   PUSH  BX
  253.                CALL  ptr_BX_data
  254.                MOV   WORD PTR [BX],0   ; no es formato 2M
  255.                POP   BX
  256.                MOV   ptrdat,BX
  257.                MOV   CX,cilsec
  258.                CMP   CH,43
  259.                JBE   p40
  260.                CMP   fdread,ON    ; si FDREAD OFF, 5.25 no admite 720K
  261.                JNE   no_525hd
  262.                XPUSH <AX, BX, CX, DX, DI, ES>
  263.                MOV   DL,disco
  264.                MOV   AH,8
  265.                PUSHF
  266.                CALL  ant_i13
  267.                CMP   BL,2         ; ¿unidad de 1.2M?
  268.                XPOP  <ES, DI, DX, CX, BX, AX>
  269.                JNE   no_525hd
  270.                CMP   CL,15        ; si DD -> simular 40 pistas
  271.                JB    p40
  272. no_525hd:      MOV   CH,79        ; forzar nº de pistas soportado
  273.                JMP   p40u80
  274. p40:           MOV   CH,39
  275. p40u80:        MOV   CL,[BX+2]    ; forzar nº de sectores soportado
  276.                MOV   DL,disco
  277.                XPOP  <BX, DS>     ; *3
  278.                PUSHF
  279.                CALL  CS:ant_i13   ; la BIOS estándar no protestará
  280.                PUSHF              ; *
  281.                XPUSH <DS, SI>     ; **
  282.                MOV   SI,40h
  283.                MOV   DS,SI
  284.                MOV   SI,90h
  285.                MOV   CL,CS:disco
  286.                MOV   CH,0
  287.                ADD   SI,CX
  288.                AND   BYTE PTR DS:[SI],11011111b ; sin doble stepping
  289.                CMP   BYTE PTR CS:cilsec+1,43    ; ¿80 pistas?
  290.                JA    step_ok                    ; así es
  291.                OR    BYTE PTR DS:[SI],00100000b ; poner doble stepping
  292. step_ok:       PUSH  ES
  293.                POP   DS                ; DS -> tabla parámetros BIOS
  294.                PUSH  CS
  295.                POP   ES                ; ES -> nuestra futura tabla
  296.                MOV   SI,DI
  297.                LEA   DI,param_fxx
  298.                MOV   CX,13             ; mejor 13 que 11
  299.                CLD
  300.                REP   MOVSB             ; copiar tabla BIOS a RAM
  301.                LEA   DI,param_fxx
  302.                PUSH  BX                ; ***
  303.                MOV   BX,CS:ptrdat
  304.                MOV   BL,CS:[BX+3]
  305.                MOV   ES:[DI+7],BL      ; GAP3 correcto para formateo
  306.                POP   BX                ; ***
  307.                MOV   CX,CS:cilsec
  308.                MOV   DL,CS:disco
  309.                XPOP  <SI, DS>          ; **
  310.                POPF                    ; *
  311.                MOV   ES:[DI+11],CH     ; nº pistas solicitado
  312.                MOV   ES:[DI+4],CL      ; nº sectores solicitado
  313.                RETF  2
  314.  
  315. ; ------------ Nueva función 5.
  316.  
  317. format:        CMP   SI,"2M"           ; ¿llaman directamente a 2M?
  318.                JE    fmt_estandar
  319.                PUSH  BX                ; nueva función de formateo
  320.                CALL  ptr_BX_data
  321.                CMP   WORD PTR CS:[BX],0
  322.                JNE   formatea_2m       ; formato 2M
  323.                POP   BX
  324.                JMP   fmt_estandar      ; formato DOS/FDF
  325.  
  326.                ; --- Formateo 2M en curso.
  327.  
  328. formatea_2m:   XPUSH <SI, DI, BP>      ; * BX ya apilado
  329.                XPUSH <DS, ES>          ; **
  330.                XPUSH <CX, DX>          ; ***
  331.                XPUSH <CS, CS>
  332.                XPOP  <DS, ES>
  333.                CALL  build_boot        ; construir arranque disco 2M
  334.                XPOP  <DX, CX>          ; ***
  335.                CALL  format_2m         ; formatear pista disco 2M
  336.                XPOP  <ES, DS>          ; **
  337.                XPOP  <BP, DI, SI, BX>  ; *
  338.                RETF  2
  339.  
  340.                ; --- Formateo estándar/fdformat en curso. Se aplican
  341.                ;     las optimizaciones activas a menos que se detecte
  342.                ;     un formato extraño en el programa que llama.
  343.  
  344. fmt_estandar:  XPUSH <AX, BX, CX, DX>  ; *1-2
  345.                XPUSH <SI, DI, BP>
  346.                XPUSH <DS, ES>
  347.                CMP   SI,"2M"           ; ¿formateo directo con 2M?
  348.                JE    fmt_ok
  349.                MOV   SI,BX             ; ES:SI buffer
  350.                MOV   BL,CH             ; cilindro
  351.                MOV   BH,DH             ; cabezal
  352.                XOR   DI,DI
  353.                MOV   DS,DI
  354.                LDS   DI,DS:[1Eh*4]     ; DS:DI -> INT 1Eh
  355.                MOV   CL,[DI+4]
  356.                MOV   CH,0              ; CX = nº sectores INT 1Eh
  357.                PUSH  CX                ; **1-2
  358. test_tam:      CMP   ES:[SI],BX
  359.                JNE   test_raro         ; cilindro/cabezal falsos
  360.                CMP   BYTE PTR ES:[SI+2],36
  361.                JA    test_raro         ; nº de sector extraño
  362.                CMP   BYTE PTR ES:[SI+2],0
  363.                JE    test_raro         ; nº de sector extraño
  364.                CMP   BYTE PTR ES:[SI+3],2
  365.                JNE   test_raro         ; el sector no es de 512
  366.                JMP   test_otro
  367. test_raro:     POP   CX                ; **1
  368.                JMP   fmt_ok            ; respetar formato pedido
  369. test_otro:     ADD   SI,4
  370.                LOOP  test_tam          ; ¿formato normal?
  371.                POP   CX                ; **2
  372.                CMP   CS:boost,ON
  373.                JNE   no_boost          ; inhibida tecnología DiskBoost
  374.                CMP   CL,15
  375.                JE    diskboost         ; 1.2M
  376.                CMP   CL,18
  377.                JNE   no_boost          ; 1.44M
  378. diskboost:     JMP   boostdisk
  379. no_boost:      CMP   CL,21
  380.                JE    optimiza          ; siempre en 1.72M (interleave)
  381.                CMP   CS:opt,ON
  382.                JE    optimiza          ; activada optimización general
  383. fmt_ok:        XPOP  <ES, DS>
  384.                XPOP  <BP, DI, SI>
  385.                XPOP  <DX, CX, BX, AX>  ; *1
  386.  
  387.                ; --- Formatear normal sin optimización.
  388.  
  389.                JMP   jmp_bios          ; función BIOS original
  390.  
  391.                ; --- Formatear con optimización «sector sliding».
  392.  
  393. optimiza:      PUSH  CS
  394.                POP   ES
  395.                MOV   BP,BX             ; cabezal/cilindro
  396.                PUSH  DX                ; * cabezal/unidad
  397.                LEA   SI,buffer_extra
  398.                MOV   AL,BYTE PTR CS:x_hd
  399.                MOV   AH,BYTE PTR CS:y_hd
  400.                CMP   CL,15             ; 15 o más sectores -> HD
  401.                JAE   xy_ok
  402.                MOV   AL,BYTE PTR CS:x_dd
  403.                MOV   AH,BYTE PTR CS:y_dd
  404. xy_ok:         PUSH  AX                ; AL = /X ,  AH = /Y
  405.                ADD   AL,AH
  406.                MUL   BL                ; cilindro * (X+Y)
  407.                MOV   DX,AX
  408.                POP   AX
  409.                MUL   BH                ; cabezal * X
  410.                ADD   AX,DX
  411.                XOR   DX,DX             ; DX:AX = cil * (X+Y) + cab * X
  412.                MOV   BL,CL
  413.                MOV   BH,0
  414.                DIV   BX                ; DL = DX:AX MOD sectores = dis
  415.                SUB   DL,CL
  416.                NEG   DL                ; DL = sectores - dis =
  417.                MOV   BL,CL             ;    = primer_sector - 1
  418.                MOV   BH,[DI+7]         ; GAP3 de formateo
  419.                SUB   BH,BYTE PTR CS:mingap  ; BH < 0 si GAP3 muy pequeño
  420.                MOV   DI,CX
  421.                SHL   DI,1
  422.                SHL   DI,1              ; DI = CX * 4
  423.                ADD   DI,SI             ; DI -> final tabla de datos
  424.                MOV   AX,SI             ; AX -> inicio tabla de datos
  425.                SUB   SI,4
  426.                MOV   DH,2              ; tamaño 512
  427.                PUSH  CX                ; **
  428. genera_pn:     ADD   SI,4
  429.                INC   DX                ; siguiente sector en la pista
  430.                CMP   DL,BL
  431.                JBE   ns_ok
  432.                MOV   DL,1              ; empezar desde el 1
  433. ns_ok:         AND   BH,BH
  434.                JNS   pon_sec           ; GAP3 es bastante grande
  435.                ADD   SI,4              ; si no, usar interleave 2:1
  436.                CMP   SI,DI
  437.                JB    pon_sec
  438.                MOV   SI,AX
  439. pon_sec:       MOV   ES:[SI],BP        ; cilindro / cabezal
  440.                MOV   ES:[SI+2],DX      ; nº sector / tamaño
  441.                LOOP  genera_pn
  442.                POP   CX                ; ** nº sectores
  443.                MOV   AL,CL             ; AL = sectores
  444.                POP   DX                ; * DL = unidad, DH = cabezal
  445.                MOV   CX,BP
  446.                XCHG  CH,CL             ; CH = cilindro
  447.                MOV   AH,5              ; formatear
  448.                LEA   BX,buffer_extra
  449.                PUSHF
  450.                CALL  CS:ant_i13
  451.                JMP   fmt_ret
  452.  
  453.                ; --- Formatear con optimización «DiskBoost».
  454.  
  455. boostdisk:     PUSH  CS
  456.                POP   ES
  457.                PUSH  [DI+6]            ; * preservar [DI+7]
  458.                MOV   DH,CL             ; DH = sectores
  459.                MOV   AH,40             ; GAP3 para 1.2
  460.                CMP   CL,15
  461.                JE    fmtgp_ok
  462.                MOV   AH,45             ; GAP3 para 1.44
  463. fmtgp_ok:      MOV   [DI+7],AH         ; GAP3 final
  464.                LEA   SI,buffer_extra
  465.                INC   CL                ; como mínimo 1 sector más
  466.                MOV   AH,BH             ; cabezal
  467.                XOR   AH,1              ; 0 en cabezal 1 y 1 en el 0
  468.                ADD   AH,CL             ; otro sector más en cabezal 0
  469.                PUSH  [DI+4]            ; ** preservar [DI+4]
  470.                MOV   [DI+4],AH         ; número de sectores final
  471.                MOV   AL,CL             ; sectores (15 ó 18) + 1
  472.                MOV   CL,AH             ; sectores finales (AL + 0 ó 1)
  473.                MOV   AH,2              ; tamaño 2 (512 bytes)
  474. haz_tabla:     MOV   ES:[SI],BX        ; cilindro / cabezal
  475.                MOV   ES:[SI+2],AX      ; número de sector / tamaño
  476.                CMP   AL,DH             ; ¿excedido el número normal?
  477.                JBE   fmt_nsok          ; no
  478.                MOV   WORD PTR ES:[SI+2],0  ; pues simular sector raro
  479. fmt_nsok:      INC   AL
  480.                CMP   AL,[DI+4]         ; ¿alcanzado último sector?
  481.                JBE   nsec_ok           ; no
  482.                MOV   AL,1              ; empezar por el primero
  483. nsec_ok:       ADD   SI,4
  484.                LOOP  haz_tabla         ; completar tabla
  485.                MOV   AH,5              ; función de formateo
  486.                MOV   AL,[DI+4]         ; nº sectores finales
  487.                MOV   CH,BL             ; cilindro
  488.                MOV   DH,BH             ; cabezal
  489.                LEA   BX,buffer_extra   ; nuestra tabla
  490.                PUSHF
  491.                CALL  CS:ant_i13        ; formatear pista
  492.                POP   [DI+4]            ; ** restaurar [DI+4]
  493.                POP   [DI+6]            ; * restaurar [DI+7]
  494.  
  495.                ; --- Retorno tras formateo sin variar flags ni AX.
  496.  
  497. fmt_ret:       XPOP  <ES, DS>
  498.                XPOP  <BP, DI, SI>
  499.                XPOP  <DX, CX, BX>      ; *2
  500.                INC   SP
  501.                INC   SP                ; quitar AX de la pila
  502.                RETF  2
  503.  
  504. ; ------------ Buscar en nuestra tabla el formato solicitado.
  505.  
  506. get_fmt        PROC
  507.                XPUSH <AX, CX, DX>      ; *
  508.                XPUSH <SI, DI, BP>
  509. get_rep:       MOV   AH,8
  510.                MOV   DL,disco
  511.                PUSH  ES
  512.                PUSHF
  513.                CALL  CS:ant_i13        ; ¿tipo de unidad?
  514.                POP   ES
  515.                JNC   t_ok
  516.                CMP   AH,6
  517.                JE    get_rep
  518.                STC
  519.                JMP   no_hay_fmt
  520. t_ok:          AND   BL,BL
  521.                JZ    no_hay_fmt
  522.                DEC   BL
  523.                MOV   BH,0
  524.                SHL   BL,1
  525.                ADD   BX,OFFSET tabla_tipos
  526.                MOV   BX,[BX]           ; BX -> lista formatos
  527.                MOV   CX,cilsec
  528. busca_fmt:     CMP   CL,[BX]
  529.                JE    ese_fmt           ; encontrado
  530. busca_otro:    CMP   BYTE PTR [BX],0
  531.                JE    no_hay_fmt        ; fin de la tabla
  532.                ADD   BX,4
  533.                JMP   busca_fmt
  534. ese_fmt:       CLC                     ; retorno correcto
  535.                JMP   fmt_rt
  536. no_hay_fmt:    STC                     ; formato no encontrado
  537. fmt_rt:        XPOP  <BP, DI, SI>
  538.                XPOP  <DX, CX, AX>      ; *
  539.                RET
  540. get_fmt        ENDP
  541.  
  542. nueva_i13      ENDP
  543.  
  544. ; ------------ Apuntar BX a los datos de la unidad DL.
  545.  
  546. ptr_BX_data    PROC
  547.                LEA   BX,fmt_A
  548.                AND   DL,DL
  549.                JZ    fmtptr_ok
  550.                LEA   BX,fmt_B
  551. fmtptr_ok:     RET
  552. ptr_BX_data    ENDP
  553.  
  554. ; ------------ Datos residentes.
  555.  
  556. disco          DB    ?
  557. cilsec         DW    ?         ; cilindros/sectores en curso
  558. ptrdat         DW    ?         ; puntero temporal a los datos
  559.  
  560. t_tams         DB    1,2,3,6,11,22     ; sectores 128 ocupados por un
  561.                                        ; sector mayor en 2MF /M
  562.  
  563. param_f2m      LABEL BYTE                      ; Tabla formato INT 1Eh
  564.                DB    0BFh, 002h, 025h, 002h    ; válida para todos los
  565. f2m_nsects     DB    016h, 01Bh, 0FFh, 06Ch    ; formatos 2M ajustando
  566.                DB    0F6h, 00Fh, 008h          ; el número de sectores
  567. f2m_npistas    DB    051h, 000h                ; y pistas
  568.  
  569. param_fxx      LABEL BYTE                      ; Tabla formato INT 1Eh
  570.                DB       ?,    ?,    ?,    ?    ; para formatos del DOS
  571.                DB       ?,    ?,    ?,    ?    ; y FDFORMAT
  572.                DB       ?,    ?,    ?
  573.                DB       ?,    ?
  574.  
  575. tabla_tipos    DW    t360    ; unidad tipo 1
  576.                DW    t1200   ; unidad tipo 2
  577.                DW    t720    ; unidad tipo 3
  578.                DW    t1440   ; unidad tipo 4
  579.                DW    t2880   ; unidad tipo 5 (BIOS AMI)
  580.                DW    t2880   ; unidad tipo 6 (BIOS IBM)
  581.  
  582.                ; Estructura de esta tabla (por cada tipo de formato):
  583.                ;  1) DB Nº de sectores del formato (0-última entrada)
  584.                ;  2) DB byte de tipo de formato: (0-DOS, 1-FDF, 2-2M)
  585.                ;  3) DW Sólo si es 2M, puntero a la tabla del formato
  586.                ;  3) DB Sólo si es FDF/DOS, nº sectores "legales"
  587.                ;  4) DB Sólo si es FDF/DOS, GAP3 para formateo
  588.                ; Esta tabla se ordena para que las unidades de mayor
  589.                ; densidad soporten los formatos de doble densidad. En
  590.                ; los formatos comunes a 2M/FDF se coloca primero 2M.
  591.  
  592. t1200          DB    15,0, 15, 84      ; 1.20M - DOS
  593.                DB    16,1, 15, 64      ; 1.31M - FDF
  594.                DB    17,1, 15, 33      ; 1.39M - FDF
  595.                DB    18,2              ; 1.47M - 2M
  596.                DW    f_1476
  597.                DB    18,1, 15, 2       ; 1.47M - FDF
  598.                DB    19,2              ; 1.55M - 2M
  599.                DW    f_1558
  600. t360           DB    8,0,   8, 127     ;  320K - DOS
  601.                DB    9,0,   9, 80      ;  360K - DOS
  602.                DB    10,2              ;  820K - 2M
  603.                DW    f_820_525
  604.                DB    10,1,  9, 40      ;  820K - FDF
  605.                DB    11,2              ;  902K - 2M
  606.                DW    f_902
  607.                DB    0       ; fin de la tabla 5.25
  608.  
  609. t2880          DB    36,0, 36, 80      ; 2.88M - DOS
  610.                DB    44,2              ; 3.60M - 2M
  611.                DW    f_3608
  612.                DB    46,2              ; 3.77M - 2M
  613.                DW    f_3772
  614. t1440          DB    18,0, 18, 108     ; 1.44M - DOS
  615.                DB    19,1, 18, 72      ; 1.55M - FDF
  616.                DB    20,1, 18, 40      ; 1.64M - FDF
  617.                DB    21,1, 18, 12      ; 1.72M - FDF
  618.                DB    22,2              ; 1.80M - 2M
  619.                DW    f_1804
  620.                DB    23,2              ; 1.88M - 2M
  621.                DW    f_1886
  622. t720           DB    9,0,   9, 80      ;  720K - DOS
  623.                DB    10,2              ;  820K - 2M
  624.                DW    f_820_350
  625.                DB    10,1,  9, 40      ;  820K - FDF
  626.                DB    12,2              ;  984K - 2M
  627.                DW    f_984
  628.                DB    13,2              ; 1.06M - 2M
  629.                DW    f_1066
  630.                DB    14,2              ; 1.14M - 2M
  631.                DW    f_1148
  632.                DB    0       ; fin de la tabla 3.5
  633.  
  634.                ; --- Sector de arranque de futuro disquete 2M y
  635.                ;     área de trabajo para el formateo estándar.
  636.  
  637. buffer_fmt     DB    0E9h            ; JMP 16 bit
  638. bf_jmp         DW    ?               ; offset del salto
  639. bf_id          DB    "2M-STV"        ; system ID
  640. bf_fmt         DW    ?               ; formato 2M correspondiente
  641.                DW    512             ; bytes por sector
  642. bf_sclus       DB    1               ; sectores por cluster
  643.                DW    1               ; sectores reservados al comienzo
  644.                DB    2               ; número de copias de la FAT
  645. bf_root        DW    224             ; entradas al directorio raíz
  646. bf_totsects    DW    ?               ; sectores totales en el disco
  647. bf_media       DB    ?               ; descriptor de medio
  648. bf_sectfat     DW    ?               ; sectores ocupados por cada FAT
  649. bf_sectpista   DW    ?               ; sectores por pista
  650.                DW    2               ; número de cabezales
  651.                DD    0               ; sectores especiales reservados
  652.                DD    0               ; número de sectores (32 bit)
  653.                DB    0               ; unidad física
  654.                DB    0               ; reservado
  655.                DB    29h             ; disquete DOS >= 4.0
  656.                DD    00000000h       ; número de serie
  657.                DB    "NO NAME    "   ; etiqueta del disco
  658.                DB    "FAT12   "      ; tipo de FAT
  659.                DB    0               ; reservado por 2M
  660. bf_checksum    DB    ?               ; checksum de 2M (si empleado)
  661.                DB    7               ; versión formato 7 (SuperBOOT)
  662. bf_fmt_vels    DB    ?               ; a 1 si formato 2MF/M
  663.                DB    ?               ; velocidad transferencia pista 0
  664.                DB    ?               ; velocidad    "       pista != 0
  665. bf_ptrboot     DW    ?               ; offset al programa de arranque
  666. bf_ptrT1       DW    76              ; T1: información para pista 0
  667. bf_ptrT2       DW    ?               ; T2: información para pista!=0
  668. bf_ptrT3       DW    ?               ; T3: tabla de tamaño de sectores
  669.  
  670. buffer_extra   DB    512 DUP (0)     ; espacio para un sector y para
  671.                                      ; el resto del arranque de 2M
  672.  
  673. fin_resid_no2m LABEL BYTE
  674.  
  675. ; *********************************************
  676. ; *   FIN DEL AREA RESIDENTE SIN SOPORTE 2M   *
  677. ; *********************************************
  678.  
  679. ; ------------ Construir sector de arranque de disquete 2M. A la
  680. ;              entrada, BX apunta al formato en la tabla.
  681.  
  682. build_boot     PROC
  683.                MOV   SI,[BX]      ; SI -> tabla con información 2M
  684.                MOV   BX,[BX+2]    ; BL = sectores, BH = cilindros-1
  685.                INC   BH                ; BH = cilindros
  686.                MOV   AX,BX
  687.                MOV   AH,0
  688.                MOV   bf_sectpista,AX
  689.                MUL   BH                ; sectores * cilindros
  690.                SHL   AX,1              ; por dos cabezales
  691.                MOV   bf_totsects,AX
  692.                MOV   CX,[SI]           ; tipo formato
  693.                MOV   bf_fmt,CX
  694.                MOV   BL,0F0h           ; media ID para 1.47M
  695.                CMP   CX,"60"
  696.                JE    media_ok
  697.                MOV   BL,0FAh           ; media ID para el resto
  698. media_ok:      MOV   bf_media,BL
  699.                MOV   CX,bf_root        ; entradas directorio raíz
  700.                SHR   CX,1
  701.                SHR   CX,1
  702.                SHR   CX,1
  703.                SHR   CX,1              ; ficheros raiz / 16
  704.                SUB   AX,CX             ; sectores totales - raiz
  705.                DEC   AX                ; y menos boot
  706.                MOV   BX,3
  707.                MUL   BX                ; 3 * (NumSect-(FichRaiz>>4)-1)
  708.                XPUSH <AX, DX>
  709.                MOV   AX,1024
  710.                MOV   DL,bf_sclus
  711.                MOV   DH,0
  712.                MUL   DX
  713.                ADD   AX,6
  714.                MOV   BX,AX             ; 6 + 1024 * SectCluster
  715.                XPOP  <DX, AX>
  716.                DIV   BX
  717.                AND   DX,DX             ; ¿división exacta?
  718.                JZ    tfat_ok
  719.                INC   AX                ; redondear
  720. tfat_ok:       MOV   bf_sectfat,AX
  721.                LEA   DI,bf_fmt_vels
  722.                ADD   SI,2
  723.                CLD
  724.                MOVSB
  725.                MOVSW
  726.                SUB   SI,2+3            ; anular ADD y MOVS
  727.                LEA   DI,buffer_extra   ; información 1ª pista física
  728.                MOV   AX,[SI+5]
  729.                MOV   [DI],AX           ; AL = nº sectores, AH = GAP3
  730.                ADD   DI,2
  731.                MOV   BX,[SI+7]         ; BL = 1º sector, interleave BH
  732.                MOV   DL,BH
  733.                MOV   DH,0              ; interleave DX
  734.                MOV   AH,0              ; AX sectores
  735.                MOV   BH,AL             ; BH sectores (control bucle)
  736.                MOV   CX,AX
  737.                ADD   CX,DI             ; ptr al último byte de T1 + 1
  738.                MOV   BP,DI
  739. crea_T1:       MOV   [DI],BL           ; poner sector
  740.                INC   BL                ; siguiente sector
  741.                ADD   DI,DX             ; factor de interleave
  742.                CMP   DI,CX
  743.                JB    ptr_ok
  744.                INC   BP
  745.                MOV   DI,BP             ; recargar puntero
  746. ptr_ok:        DEC   BH
  747.                JNZ   crea_T1
  748.                MOV   DI,CX             ; puntero a T2
  749.                MOV   bf_ptrT2,DI
  750.                SUB   bf_ptrT2,OFFSET buffer_fmt
  751.                CMP   bf_fmt_vels,1
  752.                JE    fmt_stv
  753.                MOV   CX,5              ; formato 2MF /F...
  754.                ADD   SI,9
  755.                REP   MOVSB             ; creada T2
  756.                MOV   bf_ptrT3,DI
  757.                SUB   bf_ptrT3,OFFSET buffer_fmt
  758.                MOV   CL,[DI-5]
  759.                MOV   CH,0
  760.                MOV   AL,[DI-3]
  761.                REP   STOSB             ; creada T3
  762.                JMP   boot_build
  763. fmt_stv:       MOV   CX,3              ; formato 2MF /M...
  764.                ADD   SI,9
  765.                REP   MOVSB             ; creando T2
  766.                MOV   CL,[DI-1]
  767.                MOV   CH,0              ; nº sectores
  768.                PUSH  CX                ; *
  769.                MOV   BX,SI
  770.                ADD   BX,CX             
  771.                DEC   BX                ; BX apunta a futura T3 - 1
  772.                MOV   DL,129
  773. crea_t2:       MOV   [DI],DL           ; nº sector a renumerar
  774.                LODSB
  775.                MOV   [DI+1],AL         ; nº sector final
  776.                PUSH  BX                ; **
  777.                XLAT
  778.                MOV   [DI+2],AL         ; tamaño
  779.                LEA   BX,t_tams
  780.                XLAT
  781.                ADD   DL,AL
  782.                POP   BX                ; **
  783.                ADD   DI,3
  784.                LOOP  crea_t2
  785.                POP   CX                ; *
  786.                MOV   bf_ptrT3,DI
  787.                SUB   bf_ptrT3,OFFSET buffer_fmt
  788.                REP   MOVSB
  789. boot_build:    MOV   bf_ptrboot,DI                ; apuntar arranque
  790.                SUB   bf_ptrboot,OFFSET buffer_fmt
  791.                MOV   bf_jmp,DI                    ; salto al BOOT
  792.                SUB   bf_jmp,OFFSET bf_id
  793.                MOV   BX,DI
  794.                LEA   SI,buffer_fmt[64]
  795.                XOR   AL,AL
  796. eval_chk:      DEC   BX                ; calcular checksum
  797.                CMP   BX,SI
  798.                JB    pon_chk
  799.                ADD   AL,[BX]
  800.                JMP   eval_chk
  801. pon_chk:       NEG   AL
  802.                MOV   bf_checksum,AL
  803.                LEA   SI,_BootHDPrg     ; código de arranque HD
  804.                MOV   CX,_BootHDPrgLong
  805.                CMP   bf_sectpista,15
  806.                JAE   pr_boot_ok
  807.                LEA   SI,_BootDDPrg     ; código de arranque DD
  808.                MOV   CX,_BootDDPrgLong
  809. pr_boot_ok:    CALL  xms_movsb         ; copiar arranque
  810.                JZ    pr_boot_bien      ; (podría fallar en XMS)
  811.                INC   bf_checksum       ; fallo: forzar mal checksum
  812. pr_boot_bien:  MOV   BX,DI
  813.                LEA   DI,buffer_fmt[511]
  814.                LEA   SI,msg_final[15]
  815.                MOV   CX,16
  816.                STD
  817. firma:         CMP   DI,BX
  818.                JBE   fin_build
  819.                MOVSB                   ; completar signatura final
  820.                LOOP  firma
  821. fill0:         CMP   DI,BX
  822.                JBE   fin_build
  823.                MOV   BYTE PTR [DI],0   ; rellenar de ceros el resto
  824.                DEC   DI
  825.                JMP   fill0
  826. fin_build:     RET
  827. build_boot     ENDP
  828.  
  829. ; ------------ Formatear pista de disquete 2M.
  830.  
  831. format_2m:     MOV   SI,"2M"           ; formateo 2M
  832.                MOV   AH,5              ; función de formateo
  833.                XPUSH <CX, DX>          ; *
  834.                MOV   AL,7Fh
  835.                LEA   BX,buffer_fmt     ; sector de arranque disco 2M
  836.                PUSHF
  837.                CALL  ant_i13           ; invocar el formateo de 2M
  838.                XPOP  <DX, CX>          ; *
  839.                JC    ret_fmt           ; fallo
  840.                MOV   AL,CH             ; no hubo fallo
  841.                OR    AL,DH
  842.                JZ    init_t0           ; es cilindro 0 y cabezal 0
  843.                CMP   bf_fmt_vels,1
  844.                CLC                     ; no había error
  845.                JNE   ret_fmt           ; no es formato 2MF /M
  846.                XPUSH <CX, DX>          ; *
  847.                MOV   AX,bf_sectpista   ; nº sectores
  848.                MOV   AH,3              ; función de escritura
  849.                OR    DH,80h            ; forzar escritura física
  850.                MOV   CL,1              ; desde el primer sector
  851.                PUSHF
  852.                CALL  ant_i13
  853.                JMP   ret_fmt_p
  854. init_t0:       XPUSH <CX, DX>          ; inicializar primera pista
  855.                MOV   AX,301h           ; escribir 1 sector
  856.                LEA   BX,buffer_fmt     ; el sector de arranque físico
  857.                MOV   CX,1              ; sector 1
  858.                MOV   DH,80h            ; no sector de arranque lógico
  859.                PUSHF
  860.                CALL  ant_i13           ; grabar arranque físico
  861.                JC    ret_fmt_p         ; hubo problemas
  862.                MOV   CX,bf_sectfat
  863.                CMP   CL,8
  864.                JAE   crea_SB           ; es disco de alta densidad
  865.                CLC                     ; no había error
  866.                JMP   ret_fmt_p
  867. crea_SB:       LEA   SI,_Boot2mCode    ; grabar SuperBOOT...
  868.                ADD   CL,3              ; CL primer sector
  869.                MOV   BX,5              ; número de sectores
  870. graba_SB:      PUSH  BX                ; **1-2
  871.                PUSH  CX                ; ***1-2
  872.                LEA   DI,buffer_extra   ; ES:DI -> área de 512 bytes
  873.                MOV   CX,512
  874.                CLD
  875.                CALL  xms_movsb         ; traer sector de XMS/conv.
  876.                JNZ   fallo_SB          ; fallo del controlador XMS
  877.                POP   CX
  878.                PUSH  CX
  879.                LEA   BX,buffer_extra   ; ES:BX buffer
  880.                MOV   AX,301h           ; escribir 1 sector
  881.                MOV   DH,80h            ; sector físico, no lógico
  882.                PUSHF
  883.                CALL  ant_i13           ; grabar sector SuperBOOT
  884.                POP   CX                ; ***1
  885.                INC   CL                ; siguiente sector
  886.                POP   BX                ; **1
  887.                DEC   BX
  888.                JNZ   graba_SB          ; grabar resto de SuperBOOT
  889.                JMP   ret_fmt_p
  890. fallo_SB:      POP   CX                ; ***2
  891.                POP   BX                ; **2
  892.                STC                     ; fallo al grabar SuperBOOT
  893.                MOV   AH,32             ; "fallo del controlador" :-)
  894. ret_fmt_p:     XPOP  <DX, CX>          ; *
  895. ret_fmt:       MOV   AL,0
  896.                RET
  897.  
  898. ; ------------ Ejecutar MOVSB si no hay XMS o simular MOVSB desde la
  899. ;              memoria XMS si la hay. Al offset en SI relativo a la
  900. ;              memoria XMS se le resta el offset de fin_resid_xms para
  901. ;              determinar el desplazamiento efectivo en la XMS.
  902.  
  903. xms_movsb      PROC
  904.                CMP   xms_handle,0
  905.                JNE   mov_xms
  906.                REP   MOVSB
  907.                CMP   AL,AL             ; ZF = 1 -> no hay error
  908.                JMP   ret_xms_movsb
  909. mov_xms:       XPUSH <AX, CX, SI, DS>
  910.                INC   CX
  911.                AND   CL,11111110b             ; nº bytes par
  912.                SUB   SI,OFFSET fin_resid_xms  ; dirección en XMS
  913.                XOR   AX,AX
  914.                PUSH  ES
  915.                PUSH  DI                ; destino ES:DI
  916.                PUSH  AX                ; destino memoria convencional
  917.                PUSH  AX
  918.                PUSH  SI                ; offset 0:SI en mem. ext.
  919.                PUSH  xms_handle        ; handle destino XMS
  920.                PUSH  AX                ; tamaño bloque (parte alta)
  921.                PUSH  CX                ; tamaño bloque (parte baja)
  922.                PUSH  SS
  923.                POP   DS
  924.                MOV   SI,SP             ; DS:SI apuntando a la pila
  925.                MOV   AH,0Bh            ; función para mover EMB
  926.                CALL  CS:xms_handler    ; ejecutar función XMS
  927.                ADD   SP,16             ; equilibrar pila
  928.                CMP   AL,1              ; ¿falló el controlador?
  929.                XPOP  <DS, SI, CX, AX>
  930.                JNE   ret_xms_movsb     ; error (ZF = 0)
  931.                ADD   SI,CX
  932.                ADD   DI,CX
  933.                XOR   CX,CX             ; ZF = 1
  934. ret_xms_movsb: RET
  935. xms_movsb      ENDP
  936.  
  937.                ; Tabla con las definiciones físicas de formatos 2M.
  938.                ; La primera línea de todas las entradas significa:
  939.                ;   1) Códigos del formato
  940.                ;   2) Flag de escritura tras formateo (1 si 2MF/M)
  941.                ;   3) Velocidad de transferencia en pista 0
  942.                ;   4) Velocidad de transferencia en restantes pistas
  943.                ;   5) Sectores físicos de 512 bytes en pista 0
  944.                ;   6) GAP3 para formateo en pista 0
  945.                ;   7) Primer número de sector en pista 0
  946.                ;   8) Interleave en pista 0
  947.                ; Los siguientes bytes (formato para pista!=0):
  948.                ;   En el formato estándar (2MF /F):
  949.                ;     1) Sectores físicos de 1 ó 2 Kbytes
  950.                ;     2) GAP3 para formateo
  951.                ;     3) Tamaño sector
  952.                ;     4) sector sliding al conmutar de cabezal (/X)
  953.                ;     5) sector sliding al conmutar de cilindro (/Y)
  954.                ;   En el formato de máxima capacidad (2MF /M):
  955.                ;     1) Nº sectores 128 bytes para preformateo
  956.                ;     2) GAP3 para formateo
  957.                ;     3) Sectores físicos efectivos
  958.                ;     4) Sectores numerados (tantos como indique (3))
  959.                ;     5) Tamaños de sector ordenados (ídem)
  960.  
  961. f_820_525      LABEL BYTE
  962.                DB    "05",0,1,1,9,80,1,1
  963.                DB    5,100,3,1,1
  964. f_902          LABEL BYTE
  965.                DB    "01",1,1,1,9,80,1,1
  966.                DB    32,4,5,3,1,4,2,0,4,2,4,3,0
  967. f_1476         LABEL BYTE
  968.                DB    "06",0,0,0,16,60,1,1
  969.                DB    9,50,3,1,2
  970. f_1558         LABEL BYTE
  971.                DB    "02",1,0,0,17,25,1,2
  972.                DB    53,3,6,4,1,5,2,6,3,4,4,2,4,4,3
  973. f_820_350      LABEL BYTE
  974.                DB    "07",0,2,2,9,80,1,1
  975.                DB    5,100,3,1,1
  976. f_984          LABEL BYTE
  977.                DB    "07",0,2,1,9,80,1,1
  978.                DB    6,100,3,1,1
  979. f_1066         LABEL BYTE
  980.                DB    "03",1,2,1,9,80,1,1
  981.                DB    38,5,6,3,1,4,2,0,0,4,2,4,4,0,0
  982. f_1148         LABEL BYTE
  983.                DB    "03",1,2,1,9,80,1,1
  984.                DB    38,2,4,3,1,4,2,4,3,4,4
  985. f_1804         LABEL BYTE
  986.                DB    "08",0,0,0,19,70,1,1
  987.                DB    11,40,3,1,2
  988. f_1886         LABEL BYTE
  989.                DB    "04",1,0,0,19,70,1,1
  990.                DB    64,3,7,4,1,5,2,6,3,7,4,4,4,4,4,3,2
  991. f_3608         LABEL BYTE
  992.                DB    "10",0,3,3,36,108,1,1
  993.                DB    11,126,4,1,2
  994. f_3772         LABEL BYTE
  995.                DB    "09",1,3,3,36,108,1,1
  996.                DB    127,5,12,1,7,2,8,3,9,4,10,5,11,6,12
  997.                DB    4,4,4,4,4,4,4,4,4,4,4,3
  998.  
  999. msg_final      DB    "Made in Spain", 0, 055h, 0AAh
  1000.  
  1001. fin_resid_xms  LABEL BYTE
  1002.  
  1003. ; ****************************************************
  1004. ; *   FIN DEL AREA RESIDENTE CON DATOS DE 2M EN XMS  *
  1005. ; ****************************************************
  1006.  
  1007.                ; --- Código 2M para grabar en los 5 sectores ocultos
  1008.                ;     de los disquetes de alta densidad al formatear.
  1009.  
  1010. _Boot2mCode:   INCLUDE 2MFBOOT.DB
  1011. _Boot2mLong    EQU   $-OFFSET _Boot2mCode
  1012.  
  1013.                ; --- Sectores de arranque de los disquetes 2M.
  1014.  
  1015. _BootHDPrg:    INCLUDE 2MBOOTHD.INC
  1016. _BootHDPrgLong EQU   $-OFFSET _BootHDPrg
  1017.  
  1018. _BootDDPrg:    INCLUDE 2MBOOTDD.INC
  1019. _BootDDPrgLong EQU   $-OFFSET _BootDDPrg
  1020.  
  1021. fin_residente  EQU   $  ; fin del área residente en el peor caso
  1022.  
  1023. ; ********************************************************************
  1024. ; *  FIN DEL AREA RESIDENTE CON DATOS DE 2M EN MEMORIA CONVENCIONAL  *
  1025. ; ********************************************************************
  1026.  
  1027. bytes_resid_n2 EQU   fin_resid_no2m - ini_residente  ; sin 2M
  1028. bytes_resid_x  EQU   fin_resid_xms  - ini_residente  ; datos 2M en XMS
  1029. bytes_resid    EQU   fin_residente  - ini_residente  ; datos 2M no XMS
  1030.  
  1031.  
  1032. ; *****************************
  1033. ; *                           *
  1034. ; *   I N S T A L A C I O N   *
  1035. ; *                           *
  1036. ; *****************************
  1037.  
  1038. main           PROC
  1039.                LEA   BP,parametros
  1040.                MOV   BX,81h
  1041.                CALL  obtener_param     ; analizar posibles parámetros
  1042.                JNC   params_ok         ; son correctos
  1043.                OR    error,ERRSINTAX
  1044.                JMP   informar
  1045. params_ok:     CALL  inic_general      ; inicializar ciertas variables
  1046.                TEST  error,MALBIOS
  1047.                JZ    bios_ok
  1048.                JMP   informar
  1049. bios_ok:       CALL  set_i40
  1050.                CMP   param_u,ON        ; ¿se solicita desinstalarlo?
  1051.                JNE   cont_ins          ; no
  1052.                CALL  residente?        ; sí: ¿está residente?
  1053.                JNC   desinstalable
  1054.                OR    error,NOINSTALADO ; programa aún no instalado
  1055.                JMP   informar
  1056. desinstalable: CALL  testWin
  1057.                JNC   win_out_ok
  1058.                OR    error,WIN_UNLOAD
  1059.                JMP   informar          ; no desinstalar desde Windows
  1060. win_out_ok:    OR    accion,DESINSTALADO
  1061.                MOV   ES,tsr_seg
  1062.                MOV   DI,tsr_off
  1063.                MOV   AH,ES:[DI-9]
  1064.                CALL  mx_unload         ; desinstalarlo:
  1065.                JC    fallo_desins
  1066.                MOV   DX,ES:xms_handle
  1067.                AND   DX,DX
  1068.                JZ    xms_free          ; no usaba XMS
  1069.                CMP   xms_ins,ON
  1070.                JNE   xms_free          ; que raro...
  1071.                MOV   AH,0Ah
  1072.                CALL  gestor_XMS        ; liberar XMS
  1073. xms_free:      CALL  set_i1e           ; precauciones tabla base disco
  1074.                LEA   DI,ptr_info_dos   ; restaurar unidades DOS
  1075.                JMP   settipo
  1076. fallo_desins:  OR    error,IMPDESINS   ; no es posible desinstalar
  1077.                JMP   informar
  1078. cont_ins:      CALL  residente?
  1079.                JNC   ya_reside
  1080.                CMP   AX,0              ; ¿reside una versión distinta?
  1081.                JE    instalable
  1082.                OR    error,NOINSTALABLE  ; versión incompatible
  1083.                JMP   informar
  1084. ya_reside:     OR    accion,YAINSTALADO
  1085.                CMP   param_noxms,ON    ; /NOXMS sólo admitido 1ª vez
  1086.                JNE   setpr
  1087. err_1a_vez:    OR    error,PRIMERAVEZ
  1088.                JMP   setpr
  1089. instalable:    CALL  testWin
  1090.                JNC   win_in_ok
  1091.                OR    error,WIN_LOAD
  1092.                JMP   informar          ; no instalar desde Windows
  1093. win_in_ok:     OR    accion,INSTALADO
  1094.                MOV   AL,OFF
  1095.                CMP   param_dis,AL
  1096.                JE    ins_asi           ; instalar como /NODISKCOPY
  1097.                CALL  hay2m?
  1098.                JC    ins_asi           ; si no hay 2M, /NODISKCOPY
  1099.                MOV   AL,ON             ; si hay 2M, /DISKCOPY
  1100. ins_asi:       MOV   param_dis,AL
  1101.                MOV   sopdcopy,AL
  1102.                MOV   sop2m,AL
  1103.                CALL  instalar_tsr      ; instalar el TSR
  1104.                JC    informar
  1105. setpr:         CALL  adaptar_param     ; parámetros en copia residente
  1106.                MOV   ES,tsr_seg
  1107.                LEA   DI,ptr_info_dos   ; unidades de tipo normal
  1108.                CMP   ES:sopdcopy,OFF
  1109.                JE    settipo           ; sin soporte DISKCOPY
  1110.                CMP   ES:fmt,OFF
  1111.                JE    settipo           ; sin apoyo a FORMAT
  1112.                LEA   DI,ptr_info_2m    ; unidades de tipo 2M
  1113. settipo:       CALL  set_dev_params
  1114. informar:      CMP   param_u,ON
  1115.                JE    inf_ex
  1116.                CMP   param_dis,ON
  1117.                JNE   inf_ex
  1118.                CMP   ES:sopdcopy,ON
  1119.                JE    inf_ex
  1120.                OR    error,DISKCOPYNO  ; no ha funcionado /DISKCOPY
  1121. inf_ex:        CALL  info
  1122.                MOV   DX,mem640         ; tamaño zona residente
  1123.                AND   DX,DX
  1124.                JZ    fin_noresid
  1125.                MOV   AX,3100h
  1126.                INT   21h               ; terminar residente
  1127. fin_noresid:   MOV   AX,4C00h
  1128.                INT   21h               ; terminar no residente
  1129. main           ENDP
  1130.  
  1131. instalar_tsr   PROC
  1132.                CALL  mx_get_handle     ; obtener entrada Multiplex
  1133.                JNC   handle_ok
  1134.                OR    error,MX64FULL    ; no quedan entradas
  1135.                STC
  1136.                RET
  1137. handle_ok:     MOV   multiplex_id,AH   ; entrada multiplex
  1138.                CMP   sopdcopy,ON
  1139.                JE    pide_xms
  1140.                MOV   AX,(bytes_resid_n2+15)/16
  1141.                MOV   parrafos_resid,AX ; sin soporte DISKCOPY
  1142.                JMP   instalar
  1143. pide_xms:      CALL  usar_XMS          ; si la hay, guai
  1144. instalar:      CALL  preservar_ints    ; tomar nota de vectores
  1145.                CMP   param_ml,ON       ; ¿se indicó parámetro /ML?
  1146.                JE    instalar_ml       ; en efecto
  1147.                MOV   AX,parrafos_resid ; área residente sin PSP
  1148.                CALL  UMB_alloc         ; pedir memoria superior XMS
  1149.                JNC   instalar_umb      ; hay la suficiente
  1150.                MOV   AX,parrafos_resid
  1151.                CALL  UPPER_alloc       ; pedir memoria superior DOS 5
  1152.                JC    instalar_ml       ; no hay la suficiente
  1153.                MOV   ES,AX
  1154.                CALL  upper_fork        ; dejar residente el bloque
  1155.                STC                     ; indicar que usa memoria DOS
  1156. instalar_umb:  MOV   ES,AX             ; segmento del bloque UMB
  1157.                MOV   DI,0              ; ES:0 zona a donde reubicar
  1158.                MOV   mem640,DI         ; no terminar residente
  1159.                JMP   instalar_asi
  1160. instalar_ml:   ADD   parrafos_resid,6  ; respetar 96 bytes de PSP
  1161.                MOV   AX,parrafos_resid
  1162.                MOV   mem640,AX         ; ocupar memoria convencional
  1163.                STC
  1164.                MOV   DI,96             ; instalación mem. convencional
  1165.                CALL  free_environ      ; liberar espacio de entorno
  1166.                STC                     ; no se usa XMS
  1167. instalar_asi:  CALL  inicializa_id     ; inicializar identificación
  1168.                MOV   CX,parrafos_resid
  1169.                CALL  reubicar_prog     ; reubicar programa a ES:DI
  1170.                CALL  activar_ints      ; interceptar vectores
  1171.                CLC
  1172.                RET
  1173. instalar_tsr   ENDP
  1174.  
  1175.  
  1176. ;*********************************************************
  1177. ;*                                                       *
  1178. ;*  SUBRUTINAS DE PROPOSITO GENERAL PARA LA INSTALACION  *
  1179. ;*                                                       *
  1180. ;*********************************************************
  1181.  
  1182.                INCLUDE 2MUTIL.INC
  1183.  
  1184. ; ------------ Ya está instalada otra versión distinta del programa.
  1185.  
  1186. error_version  PROC
  1187.                PUSH  ES
  1188.                LEA   DX,mal_ver_txt1
  1189.                CALL  print
  1190.                LES   DI,tsr_dir
  1191.                MOV   AL,':'
  1192.                MOV   CL,255
  1193.                CLD
  1194.                REPNE SCASB
  1195.                REPNE SCASB
  1196.                MOV   DL,ES:[DI]        ; número de versión
  1197.                MOV   AH,2
  1198.                INT   21h
  1199.                MOV   DL,'.'
  1200.                MOV   AH,2
  1201.                INT   21h
  1202.                MOV   DL,ES:[DI+2]      ; revisión
  1203.                MOV   AH,2
  1204.                INT   21h
  1205.                LEA   DX,mal_ver_txt2
  1206.                CALL  print
  1207.                POP   ES
  1208.                RET
  1209. error_version  ENDP
  1210.  
  1211. ; ------------ Inicializar ciertas variables.
  1212.  
  1213. inic_general   PROC
  1214.                CALL  inic_XMS          ; detectar controlador XMS
  1215.                MOV   AX,(bytes_resid+15)/16
  1216.                MOV   parrafos_resid,AX ; memoria máxima necesaria
  1217.                MOV   DL,0
  1218.                CALL  tipo_disco
  1219.                JNC   hay_unidad
  1220.                MOV   DL,1
  1221.                CALL  tipo_disco
  1222.                JNC   hay_unidad
  1223.                OR    error,MALBIOS     ; no hay disqueteras
  1224.                RET
  1225. hay_unidad:    RET
  1226. inic_general   ENDP
  1227.  
  1228. ; ------------ Poner 3,1 Kb de datos en XMS si la hay.
  1229.  
  1230. usar_XMS       PROC
  1231.                CMP   param_noxms,ON
  1232.                JE    ret_usx           ; parámetro /NOXMS
  1233.                CMP   xms_ins,ON
  1234.                JNE   ret_usx           ; no hay controlador XMS
  1235.                MOV   AX,XMS_off
  1236.                MOV   xms_hndl_off,AX   ; anotar dirección controlador
  1237.                MOV   AX,XMS_seg
  1238.                MOV   xms_hndl_seg,AX
  1239.                MOV   AH,9              ; pedir memoria extendida
  1240.                MOV   DX,4              ; 4 kbytes
  1241.                CALL  gestor_XMS
  1242.                CMP   AX,1
  1243.                JNE   ret_usx
  1244.                MOV   xms_handle,DX
  1245.                MOV   AX,(bytes_resid_x+15)/16
  1246.                MOV   parrafos_resid,AX ; memoria mínima necesaria
  1247.                XOR   AX,AX
  1248.                PUSH  AX
  1249.                PUSH  AX                ; desplazamiento 0:0
  1250.                PUSH  DX                ; handle destino mem. extendida
  1251.                LEA   BX,fin_resid_xms
  1252.                PUSH  CS
  1253.                PUSH  BX                ; segmento:offset
  1254.                PUSH  AX                ; handle fuente memoria conv.
  1255.                PUSH  AX                ; tamaño bloque (parte alta)
  1256.                MOV   AX,4096
  1257.                PUSH  AX                ; tamaño bloque (parte baja)
  1258.                MOV   SI,SP             ; DS:SI apuntando a la pila
  1259.                MOV   AH,0Bh            ; función para mover EMB
  1260.                CALL  gestor_XMS        ; ejecutar función XMS
  1261.                ADD   SP,16             ; equilibrar pila
  1262.                CMP   AL,1              ; ¿falló el controlador?
  1263.                JE    ret_usx
  1264.                MOV   xms_handle,0      ; falló, no usada XMS
  1265.                MOV   AX,(bytes_resid+15)/16
  1266.                MOV   parrafos_resid,AX ; memoria total necesaria
  1267. ret_usx:       RET
  1268. usar_XMS       ENDP
  1269.  
  1270. ; ------------ Inicializar área «program_id» del programa residente.
  1271. ;              A la entrada, ES:DI = seg:off a donde será reubicado
  1272. ;              y CF=0 si se utiliza memoria superior XMS.
  1273.  
  1274. inicializa_id  PROC
  1275.                PUSHF
  1276.                MOV   segmento_real,ES  ; anotar segmento del bloque
  1277.                MOV   offset_real,DI    ; ídem con el offset
  1278.                MOV   AX,parrafos_resid
  1279.                MOV   longitud_total,AX
  1280.                MOV   AL,1
  1281.                POPF                    ; CF=0: usar memoria UMB XMS
  1282.                JNC   info_ok
  1283.                DEC   AL                ; usar memoria convencional
  1284. info_ok:       OR    info_extra,AL
  1285.                RET
  1286. inicializa_id  ENDP
  1287.  
  1288. ; ------------ Devolver CF=0 si 2M o 2MX están instalados.
  1289.  
  1290. hay2m?         PROC
  1291.                PUSH  AX
  1292.                PUSH  ES
  1293.                LEA   SI,id_2m          ; identificación del programa
  1294.                MOV   CX,id_2m_tam
  1295.                MOV   AX,1492h
  1296.                MOV   ES,AX
  1297.                MOV   DI,1992h          ; ES:DI protocolo de búsqueda
  1298.                CALL  mx_find_tsr       ; buscar si está en memoria
  1299.                JNC   hay2m?_ret
  1300.                LEA   SI,id_2mx         ; identificación del programa
  1301.                MOV   CX,id_2mx_tam
  1302.                CALL  mx_find_tsr
  1303.                JNC   hay2m?_ret
  1304.                STC
  1305. hay2m?_ret:    POP   ES
  1306.                POP   AX
  1307.                RET
  1308. hay2m?         ENDP
  1309.  
  1310. ; ------------ Adaptar parámetros del programa ya instalado.
  1311.  
  1312. adaptar_param  PROC
  1313.                PUSH  ES
  1314.                MOV   ES,tsr_seg
  1315.                CMP   param_dis,-1
  1316.                JE    hay_fdr?
  1317.                MOV   AL,param_dis
  1318.                CMP   AL,OFF
  1319.                JE    sopdcopy_ok       ; siempre válido /NODISKCOPY
  1320.                CMP   ES:sop2m,ON
  1321.                JNE   hay_fdr?          ; /DISKCOPY válido si hay soporte
  1322. sopdcopy_ok:   MOV   ES:sopdcopy,AL
  1323. hay_fdr?:      CMP   param_fdr,-1
  1324.                JE    hay_opt?
  1325.                MOV   AL,param_fdr
  1326.                MOV   ES:fdread,AL
  1327. hay_opt?:      CMP   param_opt,-1
  1328.                JE    hay_boo?
  1329.                MOV   AL,param_opt
  1330.                MOV   ES:opt,AL
  1331. hay_boo?:      CMP   param_boo,-1
  1332.                JE    hay_fmt?
  1333.                MOV   AL,param_boo
  1334.                MOV   ES:boost,AL
  1335. hay_fmt?:      CMP   param_fmt,-1
  1336.                JE    adap_xh?
  1337.                MOV   AL,param_fmt
  1338.                MOV   ES:fmt,AL
  1339. adap_xh?:      CMP   param_xh,OFF
  1340.                JE    adap_yh?
  1341.                MOV   AX,x_hd
  1342.                MOV   ES:x_hd,AX
  1343. adap_yh?:      CMP   param_yh,OFF
  1344.                JE    adap_xd?
  1345.                MOV   AX,y_hd
  1346.                MOV   ES:y_hd,AX
  1347. adap_xd?:      CMP   param_xd,OFF
  1348.                JE    adap_yd?
  1349.                MOV   AX,x_dd
  1350.                MOV   ES:x_dd,AX
  1351. adap_yd?:      CMP   param_yd,OFF
  1352.                JE    adap_g?
  1353.                MOV   AX,y_dd
  1354.                MOV   ES:y_dd,AX
  1355. adap_g?:       CMP   param_g,OFF
  1356.                JE    fin_adap
  1357.                MOV   AX,mingap
  1358.                MOV   ES:mingap,AX
  1359. fin_adap:      POP   ES
  1360.                RET
  1361. adaptar_param  ENDP
  1362.  
  1363. ; ------------ Informar al usuario.
  1364.  
  1365. info           PROC
  1366.                CMP   param_ayuda,ON    ; ¿solicitud de ayuda?
  1367.                JNE   info_normal?
  1368.                LEA   DX,ayuda_txt
  1369.                CALL  print
  1370.                JMP   fin_info
  1371. info_normal?:  CMP   param_xayuda,ON   ; ¿solicitud de más ayuda?
  1372.                JNE   info_normal
  1373.                LEA   DX,mas_ayuda_txt
  1374.                CALL  print
  1375.                JC    salir_hlp
  1376.                JMP   fin_info
  1377. salir_hlp:     LEA   DX,limpia_txt     ; se pulsó ESC en la ayuda
  1378.                CALL  print
  1379.                JMP   fin_info
  1380. info_normal:   LEA   DX,programa_txt
  1381.                CALL  print
  1382.                TEST  error,0FFFFh
  1383.                JZ    info_ins          ; no hay error
  1384.                JMP   info_err          ; lo hay: informar del mismo
  1385. info_ins:      LEA   DX,instalado_txt
  1386.                TEST  accion,INSTALADO  ; ¿informar "instalado"?
  1387.                JZ    info_modo
  1388.                CALL  print
  1389.                CALL  advertir
  1390.                JMP   fin_info
  1391. info_modo:     LEA   DX,ya_instal_txt
  1392.                TEST  accion,YAINSTALADO  ; ¿informar "ya instalado"?
  1393.                JNZ   acc_ok
  1394.                LEA   DX,des_ok_txt     ; informar "desinstalado"
  1395.                CALL  print
  1396.                JMP   fin_info
  1397. acc_ok:        CALL  print             ; instalado/ya instalado...
  1398.                PUSH  ES
  1399.                MOV   ES,tsr_seg
  1400.                LEA   DX,modo_boo_txt
  1401.                CALL  print
  1402.                LEA   DX,activo_txt
  1403.                CMP   ES:boost,ON
  1404.                JE    boo_onoff_ok
  1405.                LEA   DX,inactivo_txt
  1406. boo_onoff_ok:  CALL  print
  1407.                LEA   DX,modo_opt_txt
  1408.                CALL  print
  1409.                LEA   DX,activo_txt
  1410.                CMP   ES:opt,ON
  1411.                JE    opt_onoff_ok
  1412.                LEA   DX,inactivo_txt
  1413. opt_onoff_ok:  CALL  print
  1414.                LEA   DX,modo_fdr_txt
  1415.                CALL  print
  1416.                LEA   DX,activo_txt
  1417.                CMP   ES:fdread,ON
  1418.                JE    fdr_onoff_ok
  1419.                LEA   DX,inactivo_txt
  1420. fdr_onoff_ok:  CALL  print
  1421.                LEA   DX,sopdc_txt      ; soporte DISKCOPY
  1422.                CMP   ES:sopdcopy,ON
  1423.                JE    modo_sop_ok
  1424.                LEA   DX,nosopdc_txt    ; no hay soporte DISKCOPY
  1425. modo_sop_ok:   CALL  print
  1426.                CMP   ES:sop2m,OFF
  1427.                JE    modo_fmt?         ; no hay datos para DISKCOPY
  1428.                LEA   DX,no_xms_txt
  1429.                CMP   ES:xms_handle,0
  1430.                JE    modo_xms_ok
  1431.                LEA   DX,xms_txt
  1432. modo_xms_ok:   CALL  print
  1433. modo_fmt?:     CMP   ES:fmt,OFF
  1434.                JE    modos_fin
  1435.                CMP   ES:sopdcopy,OFF
  1436.                JE    modos_fin
  1437.                LEA   DX,sop_fmt_txt    ; soporte extra para FORMAT
  1438.                CALL  print
  1439. modos_fin:     POP   ES
  1440.                CALL  advertir
  1441.                JMP   fin_info
  1442. info_err:      LEA   DX,err_sintax_txt
  1443.                TEST  error,ERRSINTAX   ; ¿error de sintaxis?
  1444.                JZ    otroerr1
  1445.                CALL  print
  1446. otroerr1:      LEA   DX,mal_bios_txt
  1447.                TEST  error,MALBIOS     ; ¿imposible detectar
  1448.                JZ    otroerr2          ; tipo unidades?
  1449.                CALL  print
  1450. otroerr2:      LEA   DX,imp_desins_txt
  1451.                TEST  error,NOINSTALADO ; no instalado, ¿piden
  1452.                JZ    otroerr4          ; desinstalar?
  1453.                CALL  print
  1454. otroerr4:      LEA   DX,des_no_ok_txt
  1455.                TEST  error,IMPDESINS   ; ¿imposible desinstalar?
  1456.                JZ    otroerr5
  1457.                CALL  print
  1458. otroerr5:      TEST  error,NOINSTALABLE  ; ¿versión incorrecta?
  1459.                JZ    otroerr6
  1460.                CALL  error_version
  1461. otroerr6:      LEA   DX,nocabe_txt
  1462.                TEST  error,MX64FULL    ; ¿imposible instalar?
  1463.                JZ    otroerr8
  1464.                CALL  print
  1465. otroerr8:      LEA   DX,win_ld_txt
  1466.                TEST  error,WIN_LOAD    ; ¿instalar desde Windows?
  1467.                JZ    otroerr9
  1468.                CALL  print
  1469. otroerr9:      LEA   DX,win_ul_txt
  1470.                TEST  error,WIN_UNLOAD  ; ¿desinstalar desde Windows?
  1471.                JZ    otroerr10
  1472.                CALL  print
  1473. otroerr10:     LEA   DX,pmt_ins_txt
  1474.                TEST  error,PRIMERAVEZ  ; ¿parámetros no permitidos?
  1475.                JZ    otroerr11
  1476.                CALL  print
  1477. otroerr11:     LEA   DX,pmt_ndc_txt
  1478.                TEST  error,DISKCOPYNO  ; ¿/DISKCOPY imposible?
  1479.                JZ    fin_info
  1480.                CALL  print
  1481. fin_info:      RET
  1482.  
  1483. advertir:      MOV   AL,param_xh
  1484.                ADD   AL,param_yh
  1485.                ADD   AL,param_xd
  1486.                ADD   AL,param_yd
  1487.                ADD   AL,param_g
  1488.                CMP   AL,OFF
  1489.                JE    fin_adv
  1490.                LEA   DX,aviso_txt
  1491.                CALL  print
  1492. fin_adv:       RET
  1493.  
  1494. info           ENDP
  1495.  
  1496. ; ------------ Utilizar preferentemente INT 40h en lugar de INT 13h.
  1497. ;              para saber si INT 13h en este ordenador acaba llamando
  1498. ;              a la INT 40h, se desvía la INT 40h y se provoca un
  1499. ;              inocuo reset de disquetes vía INT 13h para comprobar si
  1500. ;              pasa por INT 40h.
  1501.  
  1502. set_i40        PROC
  1503.                CALL  test_i40
  1504.                TEST  accion,I40
  1505.                JZ    set_i40_ret       ; no soportada la INT 40h
  1506.                MOV   i13_40_0,40h
  1507.                MOV   i13_40_1,40h      ; usar INT 40 en vez de INT 13
  1508. set_i40_ret:   RET
  1509. set_i40        ENDP
  1510.  
  1511.                ; --- Comprobar si la INT 40h está en uso
  1512.  
  1513. test_i40:      XPUSH <DS, ES>          ; *
  1514.                MOV   AX,3540h
  1515.                INT   21h
  1516.                XPUSH <ES, BX>          ; vector de INT 40h original
  1517.                LEA   DX,i40_aux
  1518.                MOV   AX,2540h
  1519.                INT   21h               ; establecer nueva INT 40h
  1520.                XOR   AX,AX
  1521.                MOV   DL,0
  1522.                INT   13h               ; reset de disco
  1523.                XPOP  <DX, DS>
  1524.                MOV   AX,2540h
  1525.                INT   21h               ; restaurar INT 40h original
  1526.                XPOP  <ES, DS>          ; *
  1527.                RET
  1528.  
  1529. i40_aux        PROC
  1530.                OR    CS:accion,I40     ; sí utilizada INT 40h
  1531.                IRET                    ; desde la INT 13h
  1532. i40_aux        ENDP
  1533.  
  1534. ; ------------ Desde Windows, no se permite instalar o desinstalar.
  1535.  
  1536. testWin        PROC
  1537.                PUSH  AX
  1538.                CMP   param_w,ON        ; ¿se indicó parámetro /W?
  1539.                JE    fin_testWin
  1540.                MOV   AX,1600h
  1541.                INT   2Fh
  1542.                AND   AL,AL             ; ¿Windows en modo extendido?
  1543.                JZ    noWinEnh
  1544.                CMP   AL,80h            ; ¿Windows en modo extendido?
  1545.                JE    noWinEnh
  1546. siWin:         STC                     ; estamos dentro de Windows
  1547.                JMP   fin_testWin
  1548. noWinEnh:      MOV   AX,4680h
  1549.                INT   2Fh
  1550.                AND   AX,AX
  1551.                JZ    siWin             ; Windows en modo real/estándar
  1552. fin_testWin:   POP   AX
  1553.                RET                     ; CF=1 si dentro de Windows
  1554. testWin        ENDP
  1555.  
  1556. ; ------------ Al desinstalar, asegurar que el mayor número de sector
  1557. ;              en la tabla base de disco es suficiente; por si estaba
  1558. ;              activa la emulación FDREAD y esto es DR-DOS.
  1559.  
  1560. set_i1e        PROC
  1561.                PUSH  ES
  1562.                MOV   AX,351Eh
  1563.                INT   21h
  1564.                CMP   BYTE PTR ES:[BX+4],63
  1565.                JAE   i1e_ok
  1566.                MOV   BYTE PTR ES:[BX+4],63
  1567. i1e_ok:        POP   ES
  1568.                RET
  1569. set_i1e        ENDP
  1570.  
  1571.  
  1572. ; ***********************************************
  1573. ; *                                             *
  1574. ; *   D A T O S    N O    R E S I D E N T E S   *
  1575. ; *                                             *
  1576. ; ***********************************************
  1577.  
  1578. ; ------------ Control de instalación.
  1579.  
  1580. offsets_ints   DW    2         ; número de vectores interceptados
  1581. i13_40_1       DB    13h       ; tabla de offsets de los vectores
  1582.                DW    nueva_i13 ; de interrupción interceptados
  1583.                DB    2Fh
  1584.                DW    nueva_i2F
  1585.  
  1586. ; ------------ Parámetros soportados
  1587.  
  1588. param_ml       DB    OFF       ; a ON si se indicó parámetro /ML
  1589. param_u        DB    OFF       ; a ON si se indicó parámetro /U
  1590. param_w        DB    OFF       ; a ON si se indicó parámetro /W
  1591. param_xh       DB    OFF       ; a ON si se indicó parámetro /XH
  1592. param_xd       DB    OFF       ; a ON si se indicó parámetro /XD
  1593. param_yh       DB    OFF       ; a ON si se indicó parámetro /YH
  1594. param_yd       DB    OFF       ; a ON si se indicó parámetro /YD
  1595. param_g        DB    OFF       ; a ON si se indicó parámetro /G
  1596. param_ayuda    DB    OFF       ; a ON si se indicó /? /H ó ?
  1597. param_xayuda   DB    OFF       ; a ON si se indicó /??
  1598. param_opt      DB    -1        ; a ON u OFF según /OPT o /NOOPT
  1599. param_boo      DB    -1        ; a ON u OFF según /BOOST o /NOBOOST
  1600. param_fdr      DB    -1        ; a ON u OFF según /FDREAD o /NOFDREAD
  1601. param_fmt      DB    -1        ; a ON u OFF según /FORMAT o /NOFORMAT
  1602. param_dis      DB    -1        ; a ON u OFF según /DISKCOPY o /NODISKCOPY
  1603. param_noxms    DB    OFF       ; a ON si se indicó /NOXMS
  1604.  
  1605. parametros     LABEL BYTE
  1606.  
  1607.                DB    "/??",0
  1608.                DW    param_xayuda
  1609.                DB    ON
  1610.  
  1611.                DB    "?",0
  1612.                DW    param_ayuda
  1613.                DB    ON
  1614.  
  1615.                DB    "/?",0
  1616.                DW    param_ayuda
  1617.                DB    ON
  1618.  
  1619.                DB    "/H",0
  1620.                DW    param_ayuda
  1621.                DB    ON
  1622.  
  1623.                DB    "/U",0
  1624.                DW    param_u
  1625.                DB    ON
  1626.  
  1627.                DB    "/W",0
  1628.                DW    param_w
  1629.                DB    ON
  1630.  
  1631.                DB    "/ML",0
  1632.                DW    param_ml
  1633.                DB    ON
  1634.  
  1635.                DB    "/G",1
  1636.                DW    0,255
  1637.                DW    mingap
  1638.                DW    param_g
  1639.                DB    ON
  1640.  
  1641.                DB    "/XH",1
  1642.                DW    0,255
  1643.                DW    x_hd
  1644.                DW    param_xh
  1645.                DB    ON
  1646.  
  1647.                DB    "/YH",1
  1648.                DW    0,255
  1649.                DW    y_hd
  1650.                DW    param_yh
  1651.                DB    ON
  1652.  
  1653.                DB    "/XD",1
  1654.                DW    0,255
  1655.                DW    x_dd
  1656.                DW    param_xd
  1657.                DB    ON
  1658.  
  1659.                DB    "/YD",1
  1660.                DW    0,255
  1661.                DW    y_dd
  1662.                DW    param_yd
  1663.                DB    ON
  1664.  
  1665.                DB    "/I",0
  1666.                DW    param_i
  1667.                DB    ON
  1668.  
  1669.                DB    "/OPt",0
  1670.                DW    param_opt
  1671.                DB    ON
  1672.  
  1673.                DB    "/NOOPt",0
  1674.                DW    param_opt
  1675.                DB    OFF
  1676.  
  1677.                DB    "/BOost",0
  1678.                DW    param_boo
  1679.                DB    ON
  1680.  
  1681.                DB    "/NOBOost",0
  1682.                DW    param_boo
  1683.                DB    OFF
  1684.  
  1685.                DB    "/FDread",0
  1686.                DW    param_fdr
  1687.                DB    ON
  1688.  
  1689.                DB    "/NOFDread",0
  1690.                DW    param_fdr
  1691.                DB    OFF
  1692.  
  1693.                DB    "/FOrmat",0
  1694.                DW    param_fmt
  1695.                DB    ON
  1696.  
  1697.                DB    "/NOFOrmat",0
  1698.                DW    param_fmt
  1699.                DB    OFF
  1700.  
  1701.                DB    "/DIskcopy",0
  1702.                DW    param_dis
  1703.                DB    ON
  1704.  
  1705.                DB    "/NODIskcopy",0
  1706.                DW    param_dis
  1707.                DB    OFF
  1708.  
  1709.                DB    "/NOXMs",0
  1710.                DW    param_noxms
  1711.                DB    ON
  1712.  
  1713.                DB    0                 ; fin de la tabla
  1714.  
  1715. ; ------------ Otras variables.
  1716.  
  1717. id_2m          DB    "CiriSOFT:2M:"    ; marcas de presencia de 2M
  1718. id_2m_tam      EQU   $-OFFSET id_2m
  1719. id_2mx         DB    "CiriSOFT:2MX:"
  1720. id_2mx_tam     EQU   $-OFFSET id_2mx
  1721.  
  1722. ERRSINTAX      EQU   1
  1723. MALBIOS        EQU   2
  1724. NOINSTALADO    EQU   4
  1725. IMPDESINS      EQU   8
  1726. NOINSTALABLE   EQU  16
  1727. MX64FULL       EQU  32
  1728. WIN_LOAD       EQU  64
  1729. WIN_UNLOAD     EQU 128
  1730. PRIMERAVEZ     EQU 256
  1731. DISKCOPYNO     EQU 512
  1732.  
  1733. INSTALADO      EQU   1         ; códigos de acción e información
  1734. YAINSTALADO    EQU   2
  1735. DESINSTALADO   EQU   4
  1736. I40            EQU   8
  1737.  
  1738. error          DW    0         ; variable para acumular errores
  1739. accion         DB    0         ; variable que indica lo sucedido
  1740.  
  1741. ; ------------ Otras variables.
  1742.  
  1743. ptr_info_2m    DW    0, 0, i1558, 0, i1886, i3772, i3772
  1744. ptr_info_dos   DW    0, 0, i1200, 0, i1440, i2880, i2880
  1745.  
  1746. i1558          DB    4, 1              ; sectores iguales / tipo 1.2M
  1747.                DW    2, 82             ; detecta cambio / nº pistas
  1748.                DB    0                 ; tipo de soporte
  1749.                DW    512               ; BPB: bytes por sector
  1750.                DB    1                 ; BPB: sectores por cluster
  1751.                DW    1                 ; BPB: sectores reservados
  1752.                DB    2                 ; BPB: número de FATs
  1753.                DW    224               ; BPB: entradas en el raíz
  1754.                DW    3116              ; BPB: nº total de sectores
  1755.                DB    0FAh              ; BPB: descriptor de medio
  1756.                DW    10                ; BPB: sectores por FAT
  1757.                DW    19, 2             ; BPB: sectores pista / cabezas
  1758.                DB    14 DUP (0)        ; BPB: restantes campos
  1759. i1886          DB    4, 7              ; sectores iguales / tipo 1.44M
  1760.                DW    2, 82             ; detecta cambio / nº pistas
  1761.                DB    0                 ; tipo de soporte
  1762.                DW    512               ; BPB: bytes por sector
  1763.                DB    1                 ; BPB: sectores por cluster
  1764.                DW    1                 ; BPB: sectores reservados
  1765.                DB    2                 ; BPB: número de FATs
  1766.                DW    224               ; BPB: entradas en el raíz
  1767.                DW    3772              ; BPB: nº total de sectores
  1768.                DB    0FAh              ; BPB: descriptor de medio
  1769.                DW    11                ; BPB: sectores por FAT
  1770.                DW    23, 2             ; BPB: sectores pista / cabezas
  1771.                DB    14 DUP (0)        ; BPB: restantes campos
  1772. i3772          DB    4, 9              ; sectores iguales / tipo 2.88M
  1773.                DW    2, 82             ; detecta cambio / nº pistas
  1774.                DB    0                 ; tipo de soporte
  1775.                DW    512               ; BPB: bytes por sector
  1776.                DB    2                 ; BPB: sectores por cluster
  1777.                DW    1                 ; BPB: sectores reservados
  1778.                DB    2                 ; BPB: número de FATs
  1779.                DW    224               ; BPB: entradas en el raíz
  1780.                DW    7544              ; BPB: nº total de sectores
  1781.                DB    0FAh              ; BPB: descriptor de medio
  1782.                DW    12                ; BPB: sectores por FAT
  1783.                DW    46, 2             ; BPB: sectores pista / cabezas
  1784.                DB    14 DUP (0)        ; BPB: restantes campos
  1785. i1200          DB    4, 1              ; sectores iguales / tipo 1.2M
  1786.                DW    2, 80             ; detecta cambio / nº pistas
  1787.                DB    0                 ; tipo de soporte
  1788.                DW    512               ; BPB: bytes por sector
  1789.                DB    1                 ; BPB: sectores por cluster
  1790.                DW    1                 ; BPB: sectores reservados
  1791.                DB    2                 ; BPB: número de FATs
  1792.                DW    224               ; BPB: entradas en el raíz
  1793.                DW    2400              ; BPB: nº total de sectores
  1794.                DB    0F9h              ; BPB: descriptor de medio
  1795.                DW    7                 ; BPB: sectores por FAT
  1796.                DW    15, 2             ; BPB: sectores pista / cabezas
  1797.                DB    14 DUP (0)        ; BPB: restantes campos
  1798. i1440          DB    4, 7              ; sectores iguales / tipo 1.44M
  1799.                DW    2, 80             ; detecta cambio / nº pistas
  1800.                DB    0                 ; tipo de soporte
  1801.                DW    512               ; BPB: bytes por sector
  1802.                DB    1                 ; BPB: sectores por cluster
  1803.                DW    1                 ; BPB: sectores reservados
  1804.                DB    2                 ; BPB: número de FATs
  1805.                DW    224               ; BPB: entradas en el raíz
  1806.                DW    2880              ; BPB: nº total de sectores
  1807.                DB    0F0h              ; BPB: descriptor de medio
  1808.                DW    9                 ; BPB: sectores por FAT
  1809.                DW    18, 2             ; BPB: sectores pista / cabezas
  1810.                DB    14 DUP (0)        ; BPB: restantes campos
  1811. i2880          DB    4, 9              ; sectores iguales / tipo 2.88M
  1812.                DW    2, 80             ; detecta cambio / nº pistas
  1813.                DB    0                 ; tipo de soporte
  1814.                DW    512               ; BPB: bytes por sector
  1815.                DB    2                 ; BPB: sectores por cluster
  1816.                DW    1                 ; BPB: sectores reservados
  1817.                DB    2                 ; BPB: número de FATs
  1818.                DW    224               ; BPB: entradas en el raíz
  1819.                DW    5760              ; BPB: nº total de sectores
  1820.                DB    0F0h              ; BPB: descriptor de medio
  1821.                DW    9                 ; BPB: sectores por FAT
  1822.                DW    36, 2             ; BPB: sectores pista / cabezas
  1823.                DB    14 DUP (0)        ; BPB: restantes campos
  1824.  
  1825. ; ------------ Texto.
  1826.  
  1827. programa_txt   DB    13,10,"  2MDOS 1.0",0
  1828.  
  1829. instalado_txt  DB    " instalado.",13,10,255," installed.",13,10,0
  1830.  
  1831. ya_instal_txt  DB    " ya instalado.",13,10,255
  1832.                DB    " already installed.",13,10,0
  1833.  
  1834. modo_boo_txt   DB    "    Optimización de formateo «DiskBoost» ",255
  1835.                DB    "    «DiskBoost» format optimization ",0
  1836.  
  1837. modo_opt_txt   DB    "    Optimización de formateo «sector sliding» ",255
  1838.                DB    "    «Sector sliding» format optimization ",0
  1839.  
  1840. modo_fdr_txt   DB    "    Emulación FDREAD ",255
  1841.                DB    "    FDREAD emulation ",0
  1842.  
  1843. activo_txt     DB    "activa.",13,10,255,"enabled.",13,10,0
  1844.  
  1845. inactivo_txt   DB    "inhibida.",13,10,255,"disabled.",13,10,0
  1846.  
  1847. sopdc_txt      DB    "    Formateo de discos destino 2M/FDFORMAT soportado por DISKCOPY.",13,10,255
  1848.                DB    "    2M/FDFORMAT target diskettes format supported by DISKCOPY.",13,10,0
  1849.  
  1850. nosopdc_txt    DB    "    Sin soporte de formateo para DISKCOPY de discos 2M/FDFORMAT.",13,10,255
  1851.                DB    "    No format support for DISKCOPY of 2M/FDFORMAT disks.",13,10,0
  1852.  
  1853. xms_txt        DB    "    Datos residentes para DISKCOPY en memoria extendida.",13,10,255
  1854.                DB    "    Resident DISKCOPY data placed in extended memory.",13,10,0
  1855.  
  1856. no_xms_txt     DB    "    Datos residentes para DISKCOPY en memoria convencional.",13,10,255
  1857.                DB    "    Resident DISKCOPY data placed in conventional memory.",13,10,0
  1858.  
  1859. sop_fmt_txt    DB    "    Soporte extra para FORMAT de «MS»-DOS habilitado.",13,10,255
  1860.                DB    "    Additional support for «MS»-DOS FORMAT enabled.",13,10,0
  1861.  
  1862. aviso_txt      DB    "    Aviso: sector sliding o GAP modificado con opciones no documentadas.",13,10,255
  1863.                DB    "    Warning: sector sliding or GAP modified with undocumented switches.",13,10,0
  1864.  
  1865. pmt_ins_txt    DB    13,10,"    El parámetro /NOXMS sólo se admite al instalar.",13,10,255
  1866.                DB    13,10,"    /NOXMS switch is only valid at installation.",13,10,0
  1867.  
  1868. pmt_ndc_txt    DB    13,10,"    No se puede activar ya el soporte de formateo para DISKCOPY si"
  1869.                DB    13,10,"    no se activó en el momento de la instalación de este programa.",13,10,255
  1870.                DB    13,10,"    It is not possible to enable now DISKCOPY format support if"
  1871.                DB    13,10,"    it wasn't actived when 2MDOS becomes resident in memory.",13,10,0
  1872.  
  1873. nocabe_txt     DB    ": Instalación imposible.",13,10
  1874.                DB    "      Ya hay 64 programas residentes con la "
  1875.                DB    "misma técnica.",13,10,255
  1876.                DB    ": Unable to install.",13,10
  1877.                DB    "      There are already 64 TSR's with the same technique."
  1878.                DB    13,10,0
  1879.  
  1880. err_sintax_txt DB    13,10,"    - Parámetro(s) incorrecto(s)."
  1881.                DB    13,10,"      Ejecute 2MDOS /? para obtener "
  1882.                DB    "ayuda.",13,10,7,255
  1883.                DB    13,10,"    - Incorrect option(s)."
  1884.                DB    13,10,"      Execute 2MDOS /? to obtain help."
  1885.                DB    13,10,7,0
  1886.  
  1887. mal_bios_txt   DB    13,10,"    - Error: No puedo detectar el tipo de las unidades."
  1888.                DB    13,10,"             Instale 2M-ABIOS ó 2M-XBIOS antes de este programa.",13,10,255
  1889.                DB    13,10,"    - Error: Impossible to detect diskette drive types."
  1890.                DB    13,10,"             Please install 2M-ABIOS or 2M-XBIOS before this program.",13,10,0
  1891.  
  1892. win_ld_txt     DB    " *NO* instalado:",13,10,"    Este programa debe cargarse ANTES de entrar en Windows.",13,10,7,255
  1893.                DB    " *NOT* installed:",13,10,"    This program must be loaded before WINDOWS.",13,10,7,0
  1894. win_ul_txt     DB    " *NO* desinstalado:",13,10,"    Este programa debe descargarse fuera de Windows.",13,10,7,255
  1895.                DB    " *NOT* uninstalled:",13,10,"    This program must be uninstalled outside of WINDOWS.",13,10,7,0
  1896.  
  1897. mal_ver_txt1   DB    13,10,"    - Error: ya está instalada la versión ",255
  1898.                DB    13,10,"    - Error: Version ",0
  1899. mal_ver_txt2   DB    " de este programa.",13,10,7,255
  1900.                DB    " of this program is already installed.",13,10,7,0
  1901.  
  1902. des_ok_txt     DB    " desinstalado.",13,10,255," uninstalled.",13,10,0
  1903.  
  1904. des_no_ok_txt  DB    13,10,"    - Desinstalación imposible (se ha "
  1905.                DB    "instalado después un programa"
  1906.                DB    13,10,"      que no respeta el convenio y tiene "
  1907.                DB    "alguna interrupción común).",13,10,7,255
  1908.                DB    13,10,"    - Uninstall unavailable (it has been"
  1909.                DB    " installed before a program that"
  1910.                DB    13,10,"      does not support CiriSOFT convention"
  1911.                DB    " and uses a common interrupt).",13,10,7,0
  1912.  
  1913. imp_desins_txt DB    13,10,"    - Programa aún no instalado: "
  1914.                DB    "imposible desinstalarlo.",13,10,255
  1915.                DB    13,10,"    - Program not installed: "
  1916.                DB    "impossible to uninstall.",13,10,0
  1917.  
  1918. limpia_txt     DB    13,"                                                                              ",13,0
  1919.  
  1920.  
  1921. ayuda_txt      LABEL BYTE
  1922. DB 13,10
  1923. DB 13,10,"          2MDOS 1.0 - MODULO DE OPTIMIZACION DEL SUBSISTEMA DE DISCO"
  1924. DB 13,10,"   (C) 1994-1995 Ciriaco García de Celis - Grupo Universitario de Informática"
  1925. DB 13,10,"   C/Renedo, 2, 4-C; 47005 Valladolid (España) - ciri@gui.uva.es - 2:341/21.8"
  1926. DB 10
  1927. DB 13,10,"       2MDOS [/FDread|NOFDread] [/DIskcopy|NODIskcopy] [/FOrmat|NOFOrmat]"
  1928. DB 13,10,"             [/OPt|NOOPt] [/BOost|NOBOost] [/NOXMs] [/ML] [/U]"
  1929. DB 10
  1930. DB 13,10," ■ Este controlador adicional crea una capa entre 2M y la BIOS para que el DOS"
  1931. DB 13,10," pueda trabajar normalmente con estos disquetes. No es preciso tener instalado"
  1932. DB 13,10," este controlador para soportar los disquetes 2M o para usar 2MF; sin embargo,"
  1933. DB 13,10," con él DISKCOPY puede copiar discos 2M formateando el disco destino. La mayor"
  1934. DB 13,10," utilidad de 2MDOS (con o sin 2M instalado)  consiste en optimizar el formateo"
  1935. DB 13,10," de discos estándar del sistema, con las poderosas técnicas «sector sliding» y"
  1936. DB 13,10," DiskBoost. Así, FORMAT (y la mayoría de programas formateadores) crean discos"
  1937. DB 13,10," totalmente estándar mucho más rápidos (sin que haya que instalar después este"
  1938. DB 13,10," programa para poder emplearlos)."
  1939. DB 10
  1940. DB 13,10," ■ Además 2MDOS da soporte por defecto a disquetes no estándar, creados por la"
  1941. DB 13,10," utilidad FDFORMAT y permite a FORMAT poder crear disquetes FDFORMAT."
  1942. DB 10
  1943. DB 13,10," ■ Este programa consume 5,7Kb en equipos sin memoria extendida (o con /NOXMS)"
  1944. DB 13,10," con ella ocupa 2,6 Kb (sólo 1,8 Kb con /NODISKCOPY ó sin 2M instalado).  Para"
  1945. DB 13,10," obtener más información sobre los parámetros ejecute 2MDOS /??"
  1946. DB 13,10,255
  1947.  
  1948. DB 13,10,"               2MDOS 1.0 - DISK SUBSYSTEM OPTIMIZATION UTILITY"
  1949. DB 13,10,"  (C) 1994-1995 Ciriaco García de Celis - Grupo Universitario de Informática."
  1950. DB 13,10,"   C/Renedo, 2, 4-C; 47005 Valladolid (Spain) - ciri@gui.uva.es - 2:341/21.8"
  1951. DB 10
  1952. DB 13,10,"       2MDOS [/FDread|NOFDread] [/DIskcopy|NODIskcopy] [/FOrmat|NOFOrmat]"
  1953. DB 13,10,"             [/OPt|NOOPt] [/BOost|NOBOost] [/NOXMs] [/ML] [/U]"
  1954. DB 10
  1955. DB 13,10," ■ This aditional driver improves the interface between 2M and BIOS,  to  make"
  1956. DB 13,10," DOS capable of normal work with these diskettes.  It  isn't necessary to load"
  1957. DB 13,10," it to support 2M disks or to run  2MF;  but when installed,  DOS DISKCOPY can"
  1958. DB 13,10," copy 2M diskettes while formatting the target disk.  But the most interesting"
  1959. DB 13,10," feature of using 2MDOS is to improve DOS standard diskette formats  (with  or"
  1960. DB 13,10," without 2M loaded) with the powerful techniques Sector Sliding & «DiskBoost»."
  1961. DB 13,10," In this way, DOS FORMAT  (and most of the rest format utilities)  can  create"
  1962. DB 13,10," very fast diskettes which are completely standard (and without having to load"
  1963. DB 13,10," 2MDOS to support them in future)."
  1964. DB 10
  1965. DB 13,10," ■ Also, 2MDOS improves by default support for FDFORMAT non standard diskettes"
  1966. DB 13,10," making DOS FORMAT capable of building FDFORMAT diskettes."
  1967. DB 10
  1968. DB 13,10," ■ This program takes 5.7 Kbytes of RAM in systems without XMS memory (or with"
  1969. DB 13,10," /NOXMS switch set) in other case it takes 2.6K  (1.8K  if  /NODISKCOPY switch"
  1970. DB 13,10," set or with 2M not loaded). For more information on switches, try 2MDOS /??"
  1971. DB 13,10,0
  1972.  
  1973. mas_ayuda_txt  LABEL BYTE
  1974. DB 13,10
  1975. DB 13,10," /DISKCOPY (por defecto si 2M está instalado) y /NODISKCOPY"
  1976. DB 13,10,"    El soporte DISKCOPY establecido por defecto permite al DISKCOPY de MS-DOS"
  1977. DB 13,10,"    y DR-DOS poder copiar disquetes 2M/FDFORMAT con la capacidad de formatear"
  1978. DB 13,10,"    el disco destino si no lo estaba.  Realmente el soporte es aún mayor  (el"
  1979. DB 13,10,"    FORMAT de DR-DOS puede incluso formatear disquetes 2M, indicando pistas y"
  1980. DB 13,10,"    sectores, pero desactiva el SuperBOOT; es mejor emplear 2MF. El FORMAT de"
  1981. DB 13,10,"    MS-DOS también funciona pero sólo crea bien discos 2M de doble densidad)."
  1982. DB 13,10,"    Si 2M no está instalado, se activa la opción inversa,  que  desactiva  el"
  1983. DB 13,10,"    soporte DISKCOPY y economiza algo de memoria."
  1984. DB 10
  1985. DB 13,10," /FORMAT y /NOFORMAT (esta última por defecto)"
  1986. DB 13,10,"    El soporte FORMAT permite al FORMAT del MS-DOS crear discos 2M y/o FDREAD"
  1987. DB 13,10,"    de alta densidad. ¡Esta opción NO ES NECESARIA para el FORMAT de DR-DOS!."
  1988. DB 13,10,"    Si no se activa esta opción, el  FORMAT  de MS-DOS creará incorrectamente"
  1989. DB 13,10,"    los discos 2M/FDREAD de alta densidad.  Esta opción es poco recomendable;"
  1990. DB 13,10,"    es  mejor  activarla sólo puntualmente para crear un disco FDREAD de alta"
  1991. DB 13,10,"    densidad y volver a inhibirla después porque, si está activa, por defecto"
  1992. DB 13,10,"    se  crearán  discos de máxima capacidad; para formatear un disco estándar"
  1993. DB 13,10,"    habría que forzarlo (/F:1.44, /F:720, /F:360; /F:1.2 debe sustituirse por"
  1994. DB 13,10,"    /T:80 /N:15, por otra limitación de FORMAT); los demás formatos deben ser"
  1995. DB 13,10,"    seleccionados indicando pistas y sectores.  Otro inconveniente de activar"
  1996. DB 13,10,"    esta opción es que, con ella activa, bajo el administrador de archivos de"
  1997. DB 13,10,"    Windows 3 sólo se pueden formatear discos 2M/FDREAD de máxima capacidad."
  1998. DB 10
  1999. DB 13,10,"                                                            [PULSA UNA TECLA]",1
  2000. DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,"                 ",13,10,10
  2001. DB 13,10," /NOXMS"
  2002. DB 13,10,"    Con esta opción, los datos residentes para el soporte DISKCOPY se colocan"
  2003. DB 13,10,"    en memoria convencional o superior en lugar de extendida;  dependiendo de"
  2004. DB 13,10,"    la clase de controlador de memoria, puede suponer economizar 4Kb de XMS ó"
  2005. DB 13,10,"    16 Kb de EMS, y emplear 3,1 kbytes más de memoria convencional/superior."
  2006. DB 10
  2007. DB 10
  2008. DB 13,10," /ML"
  2009. DB 13,10,"    Fuerza la instalación en memoria convencional, del código y datos de este"
  2010. DB 13,10,"    programa (2MDOS se autoinstala por defecto en memoria superior si puede)."
  2011. DB 10
  2012. DB 10
  2013. DB 13,10," /U"
  2014. DB 13,10,"    Desinstala el programa de la memoria, si es posible. Desinstalar 2MDOS es"
  2015. DB 13,10,"    necesario para poder desinstalar 2M, debido a la interconexión de ambos."
  2016. DB 10
  2017. DB 10
  2018. DB 13,10," /FDREAD (por defecto) y /NOFDREAD"
  2019. DB 13,10,"    Con el soporte FDREAD activo, no es necesario ya instalar la utilidad del"
  2020. DB 13,10,"    mismo nombre para soportar discos FDFORMAT. Además así FORMAT puede crear"
  2021. DB 13,10,"    disquetes FDFORMAT (con /DISKCOPY activo) indicando pistas y sectores (el"
  2022. DB 13,10,"    de  MS-DOS  no puede crear discos de alta densidad correctamente si no se"
  2023. DB 13,10,"    indica /FORMAT; el de DR-DOS no tiene problemas)."
  2024. DB 13,10,"                                                            [PULSA UNA TECLA]",1
  2025. DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,"                 "
  2026. DB 10
  2027. DB 13,10," /OPT (por defecto) y /NOOPT"
  2028. DB 13,10,"    Con la opción de optimización activa, muy recomendable,  2MDOS intercepta"
  2029. DB 13,10,"    el funcionamiento del FORMAT del DOS, Norton o PC Tools para optimizar la"
  2030. DB 13,10,"    numeración de los sectores en las pistas  («sector sliding»)  durante  el"
  2031. DB 13,10,"    proceso de formateo de un disquete estándar. El posterior acceso será más"
  2032. DB 13,10,"    rápido, sin pérdida alguna de compatibilidad, siendo los nuevos disquetes"
  2033. DB 13,10,"    tan transportables como los originales del DOS."
  2034. DB 10
  2035. DB 10
  2036. DB 13,10," /BOOST (por defecto) y /NOBOOST"
  2037. DB 13,10,"    Con esta opción habilitada, los disquetes estándar de 1.2 y 1.44M emplean"
  2038. DB 13,10,"    la nueva tecnología «DiskBoost», un 15% más rápida que «sector sliding» y"
  2039. DB 13,10,"    un 50% más de lo normal. Pueden seguir siendo accedidos sin problemas sin"
  2040. DB 13,10,"    tener instalado 2MDOS en cualquier otra máquina o sistema operativo."
  2041. DB 13,10,255
  2042.  
  2043. DB 13,10
  2044. DB 13,10," /DISKCOPY (default if 2M is installed) and /NODISKCOPY"
  2045. DB 13,10,"    DISKCOPY support set on by default,  lets both MS-DOS and DR-DOS DISKCOPY"
  2046. DB 13,10,"    programs to copy  2M/FDFORMAT  diskettes  with the capability of format a"
  2047. DB 13,10,"    unformatted target. The final support is larger (DR-DOS FORMAT is capable"
  2048. DB 13,10,"    of format 2M diskettes telling it about the number of tracks and sectors,"
  2049. DB 13,10,"    but disables SuperBOOT feature; so, 2MF is best. MS-DOS format also works"
  2050. DB 13,10,"    but only format correctly 2M double density disks). When 2M is not loaded"
  2051. DB 13,10,"    in memory the other option is enabled, to disable DISKCOPY support and to"
  2052. DB 13,10,"    save some memory."
  2053. DB 10
  2054. DB 13,10," /FORMAT and /NOFORMAT (default)"
  2055. DB 13,10,"    Format support lets  MS-DOS  FORMAT  build  2M and/or FDREAD high density"
  2056. DB 13,10,"    disks.  This option is NOT NECESSARY with DR-DOS FORMAT!.  If this option"
  2057. DB 13,10,"    is not enabled  MS-DOS  FORMAT will incorrectly format 2M and FDREAD high"
  2058. DB 13,10,"    density disks. This option isn't generally recommended; the best solution"
  2059. DB 13,10,"    is to enable it only  before  formatting  an FDREAD high density disk and"
  2060. DB 13,10,"    just disable it after.  While this option is enabled, the default will be"
  2061. DB 13,10,"    to format 2M/FDREAD maximum capacity diskettes;  to format a standard one"
  2062. DB 13,10,"    it will be necessary to force it (/F:1.44, /F:720, /F:360; /F:1.2 must be"
  2063. DB 13,10,"    replaced  by  /T:80 /N:15  due  a  FORMAT  problem); the rest of the disk"
  2064. DB 13,10,"    formats can be selected  using  track/sectors  FORMAT  switches.  Another"
  2065. DB 13,10,"    problem that appears enabling this option, is that Windows 3 file manager"
  2066. DB 13,10,"    is only able to format maximum capacity 2M/FDREAD disks."
  2067. DB 13,10,"                                                              [PRESS ANY KEY]",1
  2068. DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,"               "
  2069. DB 13,10," /NOXMS"
  2070. DB 13,10,"    With this switch enabled,  the resident data for DISKCOPY support will be"
  2071. DB 13,10,"    placed in conventional or  upper  memory,  instead  of  extended  memory;"
  2072. DB 13,10,"    depending on the memory manager type,  it  can save 4Kb of XMS or 16Kb of"
  2073. DB 13,10,"    EMS, and to spend over 3.1 Kbytes more of conventional or upper memory."
  2074. DB 10
  2075. DB 10
  2076. DB 13,10," /ML"
  2077. DB 13,10,"    Forces a conventional memory installation of  2MDOS  code and data  (this"
  2078. DB 13,10,"    program is an upper memory self-installating utility)."
  2079. DB 10
  2080. DB 10
  2081. DB 13,10," /U"
  2082. DB 13,10,"    Tells 2MDOS to uninstall, if possible.  To uninstall 2MDOS it's necessary"
  2083. DB 13,10,"    to be able to uninstall 2M, because of the connection between both TSRs."
  2084. DB 10
  2085. DB 10
  2086. DB 13,10," /FDREAD (default) and /NOFDREAD"
  2087. DB 13,10,"    With FDREAD support active,  it  is  not necessary to install the program"
  2088. DB 13,10,"    of the same name to support FDREAD diskettes.  Also, DOS FORMAT can build"
  2089. DB 13,10,"    FDFORMAT  disks  (if /DISKCOPY is active)  telling it about the number of"
  2090. DB 13,10,"    sectors and tracks (MS-DOS FORMAT can't correctly make high density disks"
  2091. DB 13,10,"    without /FORMAT switch, but DR-DOS has no problems)."
  2092. DB 13,10,"                                                              [PRESS ANY KEY]",1
  2093. DB 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,"               "
  2094. DB 10
  2095. DB 13,10," /OPT (default) and /NOOPT"
  2096. DB 13,10,"    With the format optimization enabled (recommended) DOS, Norton, PC Tools,"
  2097. DB 13,10,"    ...and other format programs will be intercepted in order to DOS optimize"
  2098. DB 13,10,"    the sector sequence along the tracks («sector sliding») during the format"
  2099. DB 13,10,"    process of a standard diskette.  Resulting access times will be very much"
  2100. DB 13,10,"    faster,  without any compatibility decrease and new diskettes as portable"
  2101. DB 13,10,"    as DOS primary ones."
  2102. DB 10
  2103. DB 10
  2104. DB 13,10," /BOOST (default) and /NOBOOST"
  2105. DB 13,10,"    With this option enabled,  standard 1.2M and 1.44M diskettes will use the"
  2106. DB 13,10,"    new «Diskboost» technology,  a 15% faster than «sector sliding» and a 50%"
  2107. DB 13,10,"    faster than DOS normal. These diskettes can be used without problems (and"
  2108. DB 13,10,"    without installing 2MDOS) in any other computer or operating system."
  2109. DB 13,10,0
  2110.  
  2111. buffer_aux     DB    64 DUP (0)   ; buffer para alguna función del DOS
  2112.  
  2113. _PRINCIPAL     ENDS
  2114.                END   inicio
  2115.